library typevariable3_test;
import self as self;
import "dart:core" as core;
import "../../runtime/reify/interceptors.dart" as int;
import "../../runtime/reify/types.dart" as typ;
import "../../runtime/reify/declarations.dart" as dec;

class C extends core::Object implements int::HasRuntimeTypeGetter {
  final field typ::ReifiedType $type;
  constructor •(typ::ReifiedType $type) → void
    : self::C::$type = $type, super core::Object::•()
    ;
  method foo(dynamic t) → dynamic {
    dynamic temp = t;
    return temp;
  }
  method foo$cc(core::Object t) → dynamic {
    return this.{=self::C::foo}(t as dynamic);
  }
  get $C$T() → typ::ReifiedType
    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
  get runtimeType() → core::Type
    return this.{=self::C::$type};
}
static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
  dec::init(d, 0, new typ::Interface::•(d.[](14)));
  dec::init(d, 1, new typ::Interface::•(d.[](14)));
  dec::init(d, 2, new typ::Interface::•(d.[](14)));
  dec::init(d, 3, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](16), <dynamic>[new typ::Interface::•(d.[](3))]), new typ::Interface::•(d.[](17))]);
  dec::init(d, 4, new typ::Interface::•(d.[](18)));
  dec::init(d, 5, new typ::Interface::•(d.[](18)));
  dec::init(d, 6, new typ::Interface::•(d.[](14)));
  dec::init(d, 7, new typ::Interface::•(d.[](19)));
  dec::init(d, 8, new typ::Interface::•(d.[](19)));
  dec::init(d, 9, new typ::Interface::•(d.[](19)));
  dec::init(d, 10, new typ::Interface::•(d.[](19)));
  dec::init(d, 11, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](20))]);
  dec::init(d, 12, new typ::Interface::•(d.[](13)));
  dec::init(d, 13, new typ::Interface::•(d.[](19)));
  dec::init(d, 14, null);
  dec::init(d, 16, new typ::Interface::•(d.[](14)));
  dec::init(d, 17, new typ::Interface::•(d.[](14)));
  dec::init(d, 18, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](16), <dynamic>[new typ::Interface::•(d.[](18))])]);
  dec::init(d, 19, new typ::Interface::•(d.[](14)));
  dec::init(d, 20, new typ::Interface::•(d.[](14)));
  return d;
}.call(dec::allocateDeclarations(<dynamic>["C", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
  self::C c = new self::C::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])])).{self::C::foo}(new self::C::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])));
}
