// 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();
}
