/*
 * Copyright (c) 2011, 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.
 */
/**
 * @assertion A function declaration statement declares a new local function.
 *   localFunctionDeclaration:
 *     functionSignature functionBody
 *   ;
 * functionSignature:
 *   metadata returnType? identifier formalParameterList
 * ;
 * returnType:
 *   void |
 *   type
 * ;
 * functionBody:
 *   async? ‘=>’ expression ‘;’ |
 *   (async | async* | sync*)?  block
 * ;
 * block:
 *   '{' statements '}'
 * ;
 * @description Checks that various correct function definitions are accepted.
 * @author kaigorodov
 */

main() {
  void func() {}
  void f(void func()) { f(func); }
  ff(void fp()) => f(fp);

  int? funktion(args) { f(func); func(); }

  int f2(int x) { throw ''; }
  func1(var x) {}
  int func2(var x, [var y = 0]) { return x + y; }
  int func3(var x, {var y: 1}) { return x * y; }
  Object? obj() => null;

  fgh(g(h())) {}
  int func4([int x = 0, int y = 0, int z = 0]) {
    return func2(x, y) + func3(y, y: z);
  }
  int foo(Object x, var y) => func4(1, 2, 3);
}

