//
// Problems in component:
//
// pkg/front_end/testcases/nnbd/issue41567.dart:13:7: Error: 'in3' can't implement both 'A<int>' and 'A<dynamic>'
//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue41567_lib.dart'.
// class in3 extends out_int implements B {} // error
//       ^
//
// pkg/front_end/testcases/nnbd/issue41567.dart:15:7: Error: 'in4' can't implement both 'A<dynamic>' and 'A<int>'
//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue41567_lib.dart'.
// class in4 extends B implements out_int {} // error
//       ^
//
library /*isNonNullableByDefault*/;
import self as self;
import "issue41567_lib.dart" as iss;

import "org-dartlang-testcase:///issue41567_lib.dart";

class B extends iss::A<dynamic> {
  synthetic constructor •() → self::B
    ;
}
class in1 extends iss::out_Object implements self::B {
  synthetic constructor •() → self::in1
    ;
}
class in2 extends self::B implements iss::out_Object {
  synthetic constructor •() → self::in2
    ;
}
class in3 extends iss::out_int implements self::B {
  synthetic constructor •() → self::in3
    ;
}
class in4 extends self::B implements iss::out_int {
  synthetic constructor •() → self::in4
    ;
}
static method main() → dynamic
  ;

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

class A<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → iss::A<iss::A::T*>*
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class out_int extends iss::A<core::int*> {
  synthetic constructor •() → iss::out_int*
    ;
}
class out_Object extends iss::A<core::Object*> {
  synthetic constructor •() → iss::out_Object*
    ;
}
