// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Dart test for static checks on situations where expressions of type void
// can be used. The point is simply that there are no compile-time errors.

// We need expressions of type `void`; `void x` would do, but using
// `void get x` will work with tools that do not yet handle `void x`.
void get x => null;

void use(dynamic x) {}

main() {
  // In an expressionStatement `e;`, e may have type void.
  x;

  // In the initialization and increment expressions of a for-loop,
  // `for (e1; e2; e3) {..}`, `e1` and `e3` may have type void.
  for (x;; x) {
    break;
  }

  // In a typeCast `e as T`, `e` may have type void.
  var y = x as Object;

  // In a parenthesized expression `(e)`, `e` may have type void.
  (x);

  // In a return statement `return e;`, when the return type of the
  // innermost enclosing function is the type void, e may have type void.
  void f() => x;

  void g() {
    return x;
  }
}
