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

// Regression test for issue 14348.

class A<T> {
  const A();
}

class B<S> extends A<S> {
  const B();
}

class C<U> {
  final A<U> a;

  const C(A<U> this.a);
  const C.optional([A<U> this.a]);
  const C.named({A<U> this.a});
  const C.untyped(this.a);
  const C.subtyped(B<U> this.a);
  const factory C.redirecting(B<U> a) = D<U>;
}

class D<U> extends C<U> {
  const D(B<U> b) : super(b);
}

class E {
  const factory E.redirecting1(int a) = F<int>;
  const factory E.redirecting2(int a) = F<int>.redirecting;
  const factory E.redirecting3(double a) = F<double>.redirecting;
}

class F<V> implements E {
  final V field;

  const F(this.field);
  const factory F.redirecting(V field) = G<V>;
}

class G<W> implements F<W> {
  final W field;
  const G(W field) : this.field = field;
}

main() {
  const A<int> a = const B<int>();

  const C(a); //# 01: ok
  const C.optional(a); //# 02: ok
  const C.named(a: a); //# 03: ok
  const C.untyped(a); //# 04: ok

  // Can't infer type argument U for C since a has type A and the argument has
  // type B<U>, not A<U>. So tries to assign A<int> to B<dynamic> which fails.
  const C.subtyped(a); //# 05: compile-time error
  const C.redirecting(a); //# 06: compile-time error

  const C<int>(a); //# 07: ok
  const C<int>.optional(a); //# 08: ok
  const C<int>.named(a: a); //# 09: ok
  const C<int>.untyped(a); //# 10: ok
  const C<int>.subtyped(a); //# 11: ok
  const C<int>.redirecting(a); //# 12: ok

  const C<double>(a); //# 13: compile-time error
  const C<double>.optional(a); //# 14: compile-time error
  const C<double>.named(a: a); //# 15: compile-time error
  const C<double>.untyped(a); //# 16: compile-time error
  const C<double>.subtyped(a); //# 17: compile-time error
  const C<double>.redirecting(a); //# 18: compile-time error

  const E.redirecting1(0); //# 19: ok
  const E.redirecting1(''); //# 20: compile-time error
  const E.redirecting2(0); //# 21: ok
  const E.redirecting2(''); //# 22: compile-time error
  const E.redirecting3(0.0); //# 23: ok
  const E.redirecting3(''); //# 24: compile-time error
}
