library;
import self as self;
import "dart:core" as core;

class T extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class V extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
    var x = /*@error=NamedFunctionExpression*/ T() {};
                                               ^", "pkg/front_end/testcases/named_function_scope.dart:46:9: Error: A function expression can't have a return type.
        T
        ^", "pkg/front_end/testcases/named_function_scope.dart:49:9: Error: A function expression can't have a name.
        T() {};
        ^", "pkg/front_end/testcases/named_function_scope.dart:63:9: Error: A function expression can't have a name.
        T< /*@context=DuplicatedNameCause*/ T>() {};
        ^"]/* from null */;
static method test() → dynamic {
  self::T t;
  self::V v;
  {
    function T() → dynamic {}
  }
  {
    dynamic v;
  }
  {
    self::T t;
    dynamic x = let final () → dynamic T = () → dynamic {} in T;
  }
  {
    self::V v;
    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
                                                ^";
  }
  {
    self::V v;
    dynamic V = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
                                                ^" in let final dynamic #t2 = null in null;
  }
  {
    dynamic x = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:49:9: Error: Can't declare 'T' because it was already used in this scope.
        T() {};
        ^" in let final () → self::T T = () → self::T {} in T;
  }
  {
    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:55:47: Error: Can't declare 'V' because it was already used in this scope.
    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
                                              ^";
  }
  {
    dynamic x = let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:63:9: Error: 'T' is already declared in this scope.
        T< /*@context=DuplicatedNameCause*/ T>() {};
        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
  }
  {
    self::T t;
    {
      let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:68:47: Error: Can't declare 'T' because it was already used in this scope.
    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
                                              ^";
      function T() → self::T {}
    }
  }
  {
    {
      let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:72:47: Error: Can't declare 'T' because it was already used in this scope.
    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
                                              ^";
      function T() → self::T {}
    }
  }
  {
    self::T t;
    {
      let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:77:47: Error: Can't declare 'T' because it was already used in this scope.
    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
                                              ^";
      function T(self::T t) → self::T {}
    }
  }
  {
    {
      let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:81:47: Error: Can't declare 'T' because it was already used in this scope.
    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
                                              ^";
      function T(self::T t) → self::T {}
    }
  }
  {
    function T(invalid-type t) → void {}
  }
}
static method main() → void {}
