// Copyright (c) 2011, 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 Otherwise, the body of q is executed with respect to the bindings
 * that resulted from the evaluation of the argument list and the type
 * parameters (if any) of q bound to the actual type arguments V1, ..., Vl
 * resulting in an object i. The result of the evaluation of e is i.
 * @description Checks that type arguments are bound correctly.
 * @author msyabro
 */

class D {}

var p1;
var p2;
var p3;

abstract class I1<T, U, V> {
  factory I1() {
    return new A<T, U, V>();
  }
}

class A<T, U, V> implements I1<T, U, V> {
  A() {
    T x = p1;
    U y = p2;
    V z = p3;
  }
}

abstract class I2 <T extends A> {
  factory I2() {
    return new B<T>();
  }
}

class B <T extends A> implements I2<T> {
  B() {}
}

abstract class I3<T, U> {
  factory I3.name() {
    return new C<T, U>.name();
  }
}

class C<T, U> implements I3<T, U> {
  C.name() {
    T a = p1;
    U b = p3;
  }
}

main() {
  p1 = 1;
  p2 = "";
  p3 = new D();
  new I1<int, String, D>();
  new I2<A>();
  new I3<int, D>.name();
}
