library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/named_function_scope.dart:26:13: Error: A function expression can't have a name.
//     var x = T() {};
//             ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
//     var V;
//         ^
// pkg/front_end/testcases/general/named_function_scope.dart:29:5: Context: Previous use of 'V'.
//     V v;
//     ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
//     var V = null;
//         ^
// pkg/front_end/testcases/general/named_function_scope.dart:34:5: Context: Previous use of 'V'.
//     V v;
//     ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: A function expression can't have a name.
//     var x = T T() {};
//               ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
//     var x = T T() {};
//               ^
// pkg/front_end/testcases/general/named_function_scope.dart:41:13: Context: Previous use of 'T'.
//     var x = T T() {};
//             ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
//     V V;
//       ^
// pkg/front_end/testcases/general/named_function_scope.dart:47:5: Context: Previous use of 'V'.
//     V V;
//     ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: A function expression can't have a name.
//     var x = T<T>() {};
//             ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
//     var x = T<T>() {};
//             ^
// pkg/front_end/testcases/general/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
//     var x = T<T>() {};
//               ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
//     T T() {}
//       ^
// pkg/front_end/testcases/general/named_function_scope.dart:55:5: Context: Previous use of 'T'.
//     T t;
//     ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
//     T T() {}
//       ^
// pkg/front_end/testcases/general/named_function_scope.dart:59:5: Context: Previous use of 'T'.
//     T T() {}
//     ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
//     T T(T t) {}
//       ^
// pkg/front_end/testcases/general/named_function_scope.dart:62:5: Context: Previous use of 'T'.
//     T t;
//     ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
//     T T(T t) {}
//       ^
// pkg/front_end/testcases/general/named_function_scope.dart:66:5: Context: Previous use of 'T'.
//     T T(T t) {}
//     ^
//
// pkg/front_end/testcases/general/named_function_scope.dart:69:12: Error: 'T' isn't a type.
//     void T(T t) {}
//            ^
//
import self as self;
import "dart:core" as core;

class T extends core::Object {
  synthetic constructor •() → self::T*
    : super core::Object::•()
    ;
}
class V extends core::Object {
  synthetic constructor •() → self::V*
    : super core::Object::•()
    ;
}
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/general/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
    var V;
        ^";
  }
  {
    self::V* v;
    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
    var V = null;
        ^" in null;
  }
  {
    () →* core::Null? x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
    var x = T T() {};
              ^" in let final () →* core::Null? T = () → core::Null? {} in T;
  }
  {
    self::V* V = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
    V V;
      ^" as{TypeError,ForDynamic} self::V*;
  }
  {
    <T extends core::Object* = dynamic>() →* core::Null? x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
    var x = T<T>() {};
            ^" in let final <T extends core::Object* = dynamic>() →* core::Null? T = <T extends core::Object* = dynamic>() → core::Null? {} in T;
  }
  {
    self::T* t;
    {
      invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
    T T() {}
      ^";
      function T() → self::T* {}
    }
  }
  {
    {
      invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
    T T() {}
      ^";
      function T() → self::T* {}
    }
  }
  {
    self::T* t;
    {
      invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
    T T(T t) {}
      ^";
      function T(self::T* t) → self::T* {}
    }
  }
  {
    {
      invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
    T T(T t) {}
      ^";
      function T(self::T* t) → self::T* {}
    }
  }
  {
    function T(invalid-type t) → void {}
  }
}
static method main() → void {}
