/*
 * 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 A constructor name always begins with the name of its immediately
 * enclosing class, and may optionally be followed by a dot and an identifier
 * id. It is a compile-time error if the name of a constructor is not a
 * constructor name.
 * A constructor declaration may conflict with static member declarations
 * (10.11).
 * Let C be a class. It is a compile-time error if C declares a
 *  • constructor named C.n and a static member with basename n.
 *
 * @description Checks that a compile-error is produced when a constructor's id
 * coincides with the name of a static getter declared in the same class.
 * @compile-error
 * @author kaigorodov
 */

class C {
  C.foo() {}
  static int get foo {}
}

main() {
  try {
    new C.foo();
  } catch (e) {}
}
