library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/deferred.dart:7:17: Error: Classes can't extend deferred classes.
// Try specifying a different superclass, or removing the extends clause.
// class B extends d.A {}
//                 ^^^
//
// pkg/front_end/testcases/general/deferred.dart:9:20: Error: Classes and mixins can't implement deferred classes.
// Try specifying a different interface, removing the class from the list, or changing the import to not be deferred.
// class C implements d.A {}
//                    ^^^
//
// pkg/front_end/testcases/general/deferred.dart:11:12: Error: Deferred classes can't be used as superclass constraints.
// Try changing the import to not be deferred.
// mixin D on d.A {}
//            ^^^
//
// pkg/front_end/testcases/general/deferred.dart:13:20: Error: Classes and mixins can't implement deferred classes.
// Try specifying a different interface, removing the class from the list, or changing the import to not be deferred.
// mixin E implements d.A {}
//                    ^^^
//
// pkg/front_end/testcases/general/deferred.dart:17:23: Error: Classes can't mix in deferred mixins.
// Try changing the import to not be deferred.
// class G = Object with d.M;
//                       ^^^
//
// pkg/front_end/testcases/general/deferred.dart:19:39: Error: Extension types can't implement deferred types.
// Try specifying a different type, removing the type from the list, or changing the import to not be deferred.
// extension type ET1(d.A id) implements d.A {}
//                                       ^^^
//
// pkg/front_end/testcases/general/deferred.dart:21:52: Error: Extension types can't implement deferred types.
// Try specifying a different type, removing the type from the list, or changing the import to not be deferred.
// extension type ET2<T extends d.A>(T id) implements d.A {}
//                                                    ^^^
//
// pkg/front_end/testcases/general/deferred.dart:23:39: Error: Extension types can't implement deferred types.
// Try specifying a different type, removing the type from the list, or changing the import to not be deferred.
// extension type ET3(int id) implements d.ET1 {}
//                                       ^^^^^
//
// pkg/front_end/testcases/general/deferred.dart:27:39: Error: Extension types can't implement deferred types.
// Try specifying a different type, removing the type from the list, or changing the import to not be deferred.
// extension type ET5(d.A id) implements d.ET2 {}
//                                       ^^^^^
//
// pkg/front_end/testcases/general/deferred.dart:29:39: Error: Extension types can't implement deferred types.
// Try specifying a different type, removing the type from the list, or changing the import to not be deferred.
// extension type ET6(d.B id) implements d.B {}
//                                       ^^^
//
// pkg/front_end/testcases/general/deferred.dart:15:14: Error: Classes can't mix in deferred mixins.
// Try changing the import to not be deferred.
// class F with d.M {}
//              ^^^
//
// pkg/front_end/testcases/general/deferred.dart:19:20: Error: The type 'A' is deferred loaded via prefix 'd' and can't be used as a type annotation.
//  - 'A' is from 'pkg/front_end/testcases/general/deferred_lib2.dart'.
// Try removing 'deferred' from the import of 'd' or use a supertype of 'A' that isn't deferred.
// extension type ET1(d.A id) implements d.A {}
//                    ^^^
//
// pkg/front_end/testcases/general/deferred.dart:25:20: Error: The type 'A' is deferred loaded via prefix 'd' and can't be used as a type annotation.
//  - 'A' is from 'pkg/front_end/testcases/general/deferred_lib2.dart'.
// Try removing 'deferred' from the import of 'd' or use a supertype of 'A' that isn't deferred.
// extension type ET4(d.A id) {}
//                    ^^^
//
// pkg/front_end/testcases/general/deferred.dart:27:20: Error: The type 'A' is deferred loaded via prefix 'd' and can't be used as a type annotation.
//  - 'A' is from 'pkg/front_end/testcases/general/deferred_lib2.dart'.
// Try removing 'deferred' from the import of 'd' or use a supertype of 'A' that isn't deferred.
// extension type ET5(d.A id) implements d.ET2 {}
//                    ^^^
//
// pkg/front_end/testcases/general/deferred.dart:29:20: Error: The type 'int' is deferred loaded via prefix 'd' and can't be used as a type annotation.
// Try removing 'deferred' from the import of 'd' or use a supertype of 'int' that isn't deferred.
// extension type ET6(d.B id) implements d.B {}
//                    ^^^
//
// pkg/front_end/testcases/general/deferred.dart:31:1: Error: The type 'A' is deferred loaded via prefix 'd' and can't be used as a type annotation.
//  - 'A' is from 'pkg/front_end/testcases/general/deferred_lib2.dart'.
// Try removing 'deferred' from the import of 'd' or use a supertype of 'A' that isn't deferred.
// d.A a = new d.A();
// ^^^
//
// pkg/front_end/testcases/general/deferred.dart:33:1: Error: The type 'int' is deferred loaded via prefix 'd' and can't be used as a type annotation.
// Try removing 'deferred' from the import of 'd' or use a supertype of 'int' that isn't deferred.
// d.B b = 0;
// ^^^
//
import self as self;
import "deferred_lib2.dart" as def;
import "dart:core" as core;

import "org-dartlang-testcase:///deferred_lib2.dart" deferred as d;

class B extends def::A {
  synthetic constructor •() → self::B
    : super def::A::•()
    ;
}
class C extends core::Object implements def::A {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
}
abstract class D extends def::A /*isMixinDeclaration*/  {
}
abstract class E extends core::Object implements def::A /*isMixinDeclaration*/  {
}
class F extends self::_F&Object&M {
  synthetic constructor •() → self::F
    : super self::_F&Object&M::•()
    ;
}
class G extends core::Object implements def::M /*isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::G
    : super core::Object::•()
    ;
}
abstract class _F&Object&M extends core::Object implements def::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_F&Object&M
    : super core::Object::•()
    ;
}
extension type ET1(def::A id) implements def::A {
  abstract extension-type-member representation-field get id() → def::A;
  constructor • = self::ET1|constructor#;
  constructor tearoff • = self::ET1|constructor#_#new#tearOff;
}
extension type ET2<T extends def::A>(T id) implements def::A {
  abstract extension-type-member representation-field get id() → T;
  constructor • = self::ET2|constructor#;
  constructor tearoff • = self::ET2|constructor#_#new#tearOff;
}
extension type ET3(core::int id) implements def::ET1% /* erasure=core::int, declared=! */ {
  abstract extension-type-member representation-field get id() → core::int;
  constructor • = self::ET3|constructor#;
  constructor tearoff • = self::ET3|constructor#_#new#tearOff;
}
extension type ET4(def::A id) {
  abstract extension-type-member representation-field get id() → def::A;
  constructor • = self::ET4|constructor#;
  constructor tearoff • = self::ET4|constructor#_#new#tearOff;
}
extension type ET5(def::A id) implements def::ET2% /* erasure=def::A, declared=! */ {
  abstract extension-type-member representation-field get id() → def::A;
  constructor • = self::ET5|constructor#;
  constructor tearoff • = self::ET5|constructor#_#new#tearOff;
}
extension type ET6(core::int id) implements core::int {
  abstract extension-type-member representation-field get id() → core::int;
  constructor • = self::ET6|constructor#;
  constructor tearoff • = self::ET6|constructor#_#new#tearOff;
}
static field def::A a = let final dynamic #t1 = CheckLibraryIsLoaded(d) in new def::A::•();
static field core::int b = 0;
static extension-type-member method ET1|constructor#(def::A id) → self::ET1 /* erasure=def::A */ {
  lowered final self::ET1 /* erasure=def::A */ #this = id;
  return #this;
}
static extension-type-member synthetic method ET1|constructor#_#new#tearOff(def::A id) → self::ET1 /* erasure=def::A */
  return self::ET1|constructor#(id);
static extension-type-member method ET2|constructor#<T extends def::A>(self::ET2|constructor#::T id) → self::ET2<self::ET2|constructor#::T> /* erasure=self::ET2|constructor#::T */ {
  lowered final self::ET2<self::ET2|constructor#::T> /* erasure=self::ET2|constructor#::T */ #this = id;
  return #this;
}
static extension-type-member synthetic method ET2|constructor#_#new#tearOff<T extends def::A>(self::ET2|constructor#_#new#tearOff::T id) → self::ET2<self::ET2|constructor#_#new#tearOff::T> /* erasure=self::ET2|constructor#_#new#tearOff::T */
  return self::ET2|constructor#<self::ET2|constructor#_#new#tearOff::T>(id);
static extension-type-member method ET3|constructor#(core::int id) → self::ET3% /* erasure=core::int, declared=! */ {
  lowered final self::ET3% /* erasure=core::int, declared=! */ #this = id;
  return #this;
}
static extension-type-member synthetic method ET3|constructor#_#new#tearOff(core::int id) → self::ET3% /* erasure=core::int, declared=! */
  return self::ET3|constructor#(id);
static extension-type-member method ET4|constructor#(def::A id) → self::ET4% /* erasure=def::A, declared=! */ {
  lowered final self::ET4% /* erasure=def::A, declared=! */ #this = id;
  return #this;
}
static extension-type-member synthetic method ET4|constructor#_#new#tearOff(def::A id) → self::ET4% /* erasure=def::A, declared=! */
  return self::ET4|constructor#(id);
static extension-type-member method ET5|constructor#(def::A id) → self::ET5% /* erasure=def::A, declared=! */ {
  lowered final self::ET5% /* erasure=def::A, declared=! */ #this = id;
  return #this;
}
static extension-type-member synthetic method ET5|constructor#_#new#tearOff(def::A id) → self::ET5% /* erasure=def::A, declared=! */
  return self::ET5|constructor#(id);
static extension-type-member method ET6|constructor#(core::int id) → self::ET6 /* erasure=core::int */ {
  lowered final self::ET6 /* erasure=core::int */ #this = id;
  return #this;
}
static extension-type-member synthetic method ET6|constructor#_#new#tearOff(core::int id) → self::ET6 /* erasure=core::int */
  return self::ET6|constructor#(id);
static method main() → dynamic {
  core::print(#C1);
  core::print(#C1);
}

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

typedef B = core::int;
class A extends core::Object {
  synthetic constructor •() → def::A
    : super core::Object::•()
    ;
}
abstract class M extends core::Object /*isMixinDeclaration*/  {
}
extension type ET1(core::int i) {
  abstract extension-type-member representation-field get i() → core::int;
  constructor • = def::ET1|constructor#;
  constructor tearoff • = def::ET1|constructor#_#new#tearOff;
}
extension type ET2(def::A i) {
  abstract extension-type-member representation-field get i() → def::A;
  constructor • = def::ET2|constructor#;
  constructor tearoff • = def::ET2|constructor#_#new#tearOff;
}
static extension-type-member method ET1|constructor#(core::int i) → def::ET1% /* erasure=core::int, declared=! */ {
  lowered final def::ET1% /* erasure=core::int, declared=! */ #this = i;
  return #this;
}
static extension-type-member synthetic method ET1|constructor#_#new#tearOff(core::int i) → def::ET1% /* erasure=core::int, declared=! */
  return def::ET1|constructor#(i);
static extension-type-member method ET2|constructor#(def::A i) → def::ET2% /* erasure=def::A, declared=! */ {
  lowered final def::ET2% /* erasure=def::A, declared=! */ #this = i;
  return #this;
}
static extension-type-member synthetic method ET2|constructor#_#new#tearOff(def::A i) → def::ET2% /* erasure=def::A, declared=! */
  return def::ET2|constructor#(i);

constants  {
  #C1 = TypeLiteralConstant(def::A)
}
