// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// @assertion Members inherited in a class in an opted-in library, which are
/// inherited via a class or mixin defined in a legacy library are viewed with
/// their erased legacy signature, even if they were original defined in an
/// opted-in library. Note that if a class which is defined in a legacy library
/// inherits a member with the same name from multiple super-interfaces, then
/// error checking is done as usual using the legacy typing rules which ignore
/// nullability. This means that it is valid for a legacy class to inherit the
/// same member signature with contradictory nullability information. For the
/// purposes of member lookup within a legacy library, nullability information is
/// ignored, and so it is valid to simply erase the nullability information
/// within the legacy library. When referenced from an opted-in library, the same
/// erasure is performed, and the member is seen at its legacy type.
///
/// We use legacy subtyping when checking inherited member signature coherence in
/// classes because opted out libraries may bring together otherwise incompatible
/// member signatures without causing an error.
///
/// @description Check that generic legacy class can inherit two opted in classes
/// with type parameters with contradictory nullability information.
///
/// @author iarkh@unipro.ru

// Requirements=nnbd-weak

import "override_checking_A03_opted_out_lib.dart";

class I1<T extends int?> extends LEGACY_INT_2<T> {}
class I2<T extends int>  extends LEGACY_INT_2<T> {}
class I3<T extends Null> extends LEGACY_INT_2<T> {}

class O1<T extends Object?> extends LEGACY_OBJECT_2<T> {}
class O2<T extends Object > extends LEGACY_OBJECT_2<T> {}
class O3<T extends Null   > extends LEGACY_OBJECT_2<T> {}

class F1<T extends Function?> extends LEGACY_FUNCTION_2<T> {}
class F2<T extends Function > extends LEGACY_FUNCTION_2<T> {}
class F3<T extends Null     > extends LEGACY_FUNCTION_2<T> {}

main() {
 I1();
 I2();
 I3();

 I1<int>();
 I1<int?>();
 I1<Null>();
 I2<int>();
 I3<Null>();

 O1();
 O2();
 O3();

 O1<Object>();
 O1<Object?>();
 O1<Null>();
 O2<Object>();
 O3<Null>();

 F1();
 F2();
 F3();

 F1<Function>();
 F1<Function?>();
 F1<Null>();

 F2<Function>();
 F3<Null>();
}
