// 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 The static type of an instance creation expression of either the
 * form new T.id(a1, ..., an, xn+1: an+1, ..., xn+k: an+k) or the form
 * new T(a1, ..., an, xn+1: an+1, ..., xn+k: an+k) is T.
 * It is a static warning if the static type of ai , 1 <= i <= n + k may not
 * be assigned to the type of the corresponding formal parameter of the
 * constructor T.id (respectively T).
 * @description Checks that the static type of an instance creation expression
 * is T.
 * @static-clean
 * @author msyabro
 * @reviewer rodionov
 */

class C {
  C() {}
  C.name() {}
}

class R {
  R(): this.redirect();
  R.name(): this.redirect();
  R.redirect() {}
}

abstract class I {
  factory I() = F;
  factory I.name() = F.name;
}

class F implements I {
  F() {}
  F.name() {}
}

main() {
  C c = new C();
  C cNamed = new C.name();

  R r = new R();
  R rNamed = new R.name();

  I i = new I();
  I iNamed = new I.name();
}
