main = <No Member>;
//
// Problems in component:
//
// org-dartlang-test:///mypackage/c.dart:3:7: Error: 'Baz' can't implement both 'Foo<int>' and 'Foo<String>'
//  - 'Foo' is from 'package:mypackage/a.dart' ('org-dartlang-test:///mypackage/a.dart').
// class Baz extends Bar<int> implements Foo<String> {}
//       ^
//
library from "org-dartlang-test:///main.dart" as main {

  import "package:mypackage/a.dart";

}
library from "package:mypackage/a.dart" as a {

  import "package:mypackage/b.dart";

  class Foo<T extends dart.core::Object* = dynamic> extends dart.core::Object {
    synthetic constructor •() → a::Foo<a::Foo::T*>*
      : super dart.core::Object::•()
      ;
    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
  }
  class Bar<T extends dart.core::Object* = dynamic> extends a::Foo<a::Bar::T*> {
    synthetic constructor •() → a::Bar<a::Bar::T*>*
      : super a::Foo::•()
      ;
  }
}
library from "package:mypackage/b.dart" as b {

  import "package:mypackage/a.dart";

  part package:mypackage/c.dart;
  class Baz extends a::Bar<dart.core::int*> implements a::Foo<dart.core::String*> { // from org-dartlang-test:///mypackage/c.dart
    synthetic constructor •() → b::Baz*
      : super a::Bar::•()
      ;
  }
}
