library;
//
// Problems in library:
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:9:15: Error: Can only use type variables in instance methods.
//   static C<T> staticMethod() {
//               ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:10:11: Error: Type variables can't be used in static members.
//     print(T);
//           ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:11:5: Error: Type variables can't be used in static members.
//     T t;
//     ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:12:7: Error: Type variables can't be used in static members.
//     C<T> l;
//       ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:13:9: Error: Type variables can't be used in static members.
//     C<C<T>> ll;
//         ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:14:13: Error: Type variables can't be used in static members.
//     const C<T>();
//             ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:15:12: Error: Type variables can't be used in static members.
//     const <T>[];
//            ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:16:14: Error: Type variables can't be used in static members.
//     const <C<T>>[];
//              ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:17:20: Error: Type variables can't be used in static members.
//     const <Object>[T];
//                    ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:18:28: Error: Type variables can't be used in static members.
//     const <Object>[const C<T>()];
//                            ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:26:13: Error: Type variables can't be used as constants.
//     const C<T>();
//             ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:27:12: Error: Type variables can't be used as constants.
//     const <T>[];
//            ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:28:14: Error: Type variables can't be used as constants.
//     const <C<T>>[];
//              ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:29:20: Error: Type variables can't be used as constants.
//     const <Object>[T];
//                    ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart:30:28: Error: Type variables can't be used as constants.
//     const <Object>[const C<T>()];
//                            ^
//
import self as self;
import "dart:core" as core;

class C<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::C<self::C::T*>*
    : super core::Object::•()
    ;
  static method staticMethod() → self::C<dynamic>* {
    core::print(invalid-type);
    invalid-type t;
    self::C<invalid-type>* l;
    self::C<self::C<invalid-type>*>* ll;
    #C1;
    #C2;
    #C3;
    #C5;
    #C6;
  }
  method instanceMethod() → self::C<self::C::T*>* {
    core::print(self::C::T*);
    self::C::T* t;
    self::C<self::C::T*>* l;
    self::C<self::C<self::C::T*>*>* ll;
    #C1;
    #C2;
    #C3;
    #C5;
    #C6;
  }
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic {}

constants  {
  #C1 = self::C<invalid-type> {}
  #C2 = <invalid-type>[]
  #C3 = <self::C<invalid-type>*>[]
  #C4 = TypeLiteralConstant(invalid-type)
  #C5 = <core::Object*>[#C4]
  #C6 = <core::Object*>[#C1]
}

Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///type_variable_uses.dart:10:11 -> TypeLiteralConstant(<invalid>)
Extra constant evaluation: evaluated: 4, effectively constant: 1
