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>() {};
        ^", "pkg/front_end/testcases/named_function_scope.dart:84:32: Error: 'T' isn't a type.
    void T(/*@error=NotAType*/ T t) {}
                               ^"]/* from null */;
static method test() → dynamic {
  self::T t;
  self::V v;
  {
    function T() → core::Null {}
  }
  {
    dynamic v;
  }
  {
    self::T t;
    () → core::Null x = let final () → core::Null T = () → core::Null {} 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;
                                              ^" as{TypeError} self::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 {}
