// 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

class A {
  const A();
}

class B extends A {
  const B();
}

class C extends A {
  const C();
  const factory C.d() = D;
}

class D extends B implements C {
  const D();
}

class Test1 {
  final A x = const A(); //# 01: ok
  final A x = const B(); //# 02: ok
  final B x = const A(); //# 03: compile-time error
  final B x = const C(); //# 04: compile-time error
  final B x = const C.d(); //# 05: compile-time error
  const Test1();
}

// Will be instantiated with U=A and V=B.
class Test2<U, V> {
  final U x = const A(); //# 06: compile-time error
  final U x = const B(); //# 07: compile-time error
  final V x = const A(); //# 08: compile-time error
  final V x = const C(); //# 09: compile-time error
  final V x = const C.d(); //# 10: compile-time error
  const Test2();
}

// Will be instantiated with U=A and V=B.
class Test3<U extends A, V extends B> {
  final U x = const A(); //# 11: compile-time error
  final U x = const B(); //# 12: compile-time error
  final V x = const A(); //# 13: compile-time error
  final V x = const C(); //# 14: compile-time error
  final V x = const C.d(); //# 15: compile-time error
  const Test3();
}

// Will be instantiated with U=A and V=B.
class Test4<U extends A, V extends A> {
  final U x = const A(); //# 16: compile-time error
  final U x = const B(); //# 17: compile-time error
  final V x = const A(); //# 18: compile-time error
  final V x = const C(); //# 19: compile-time error
  final V x = const C.d(); //# 20: compile-time error
  const Test4();
}

// Will be instantiated with U=dynamic and V=dynamic.
class Test5<U extends A, V extends B> {
  final U x = const A(); //# 21: compile-time error
  final U x = const B(); //# 22: compile-time error
  final V x = const A(); //# 23: compile-time error
  final V x = const C(); //# 24: compile-time error
  final V x = const C.d(); //# 25: compile-time error
  const Test5();
}

use(x) => x;

main() {
  use(const Test1());
  use(const Test2<A, B>());
  use(const Test3<A, B>());
  use(const Test4<A, B>());
  use(const Test5());
}
