// Copyright (c) 2014, 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.

// @dart = 2.9

import "package:expect/expect.dart";
import "inheritance_constraints_lib.dart" deferred as lib;

class Foo {}

class Foo2 extends D {}

class A extends lib.Foo {}
//              ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.SUBTYPE_OF_DEFERRED_CLASS

class B implements lib.Foo {}
//                 ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.SUBTYPE_OF_DEFERRED_CLASS

class C1 {}

class C = C1 with lib.Foo;
//                ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.SUBTYPE_OF_DEFERRED_CLASS

class D {
  D();
  factory D.factory() = lib.Foo2;
//                      ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_INVALID_RETURN_TYPE
// [cfe] The constructor function type 'Foo2 Function()' isn't a subtype of 'D Function()'.
}

void main() {
  new A();
  new B();
  new C();
  new D.factory();
}
