// Copyright (c) 2012, 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 test checking that static/instance field shadowing do not conflict.

// Test that certain interfaces/classes are blacklisted from being
// implemented or extended.

// bool.
class MyBool implements bool {} //                    //# 01: compile-time error
abstract class MyBoolInterface implements bool default F { // //# 02: syntax error
  MyBoolInterface(); //                               //# 02: continued
} //                                                  //# 02: continued

// num.
class MyNum implements num {} //                      //# 03: compile-time error
abstract class MyNumInterface implements num default F { //   //# 04: syntax error
  MyNumInterface(); //                                //# 04: continued
} //                                                  //# 04: continued

// int.
class MyInt implements int {} //                      //# 05: compile-time error
abstract class MyIntInterface implements int default F { //   //# 06: syntax error
  MyIntInterface(); //                                //# 06: continued
} //                                                  //# 06: continued

// double.
class MyDouble implements double {} //                    //# 07: compile-time error
abstract class MyDoubleInterface implements double default F { // //# 08: syntax error
  MyDoubleInterface(); //                                 //# 08: continued
} //                                                      //# 08: continued

// String.
class MyString implements String {} //                    //# 09: compile-time error
abstract class MyStringInterface implements String default F { // //# 10: syntax error
  MyStringInterface(); //                                 //# 10: continued
} //                                                      //# 10: continued

// Function.
class MyFunction implements Function {}

class MyOtherFunction extends Function {}
abstract class MyFunctionInterface implements Function default F { // //# 12: syntax error
  MyFunctionInterface(); //                                   //# 12: continued
} //                                                          //# 12: continued

// dynamic.
class MyDynamic implements dynamic {} //                     //# 13: compile-time error
abstract class MyDynamicInterface implements dynamic default F { //  //# 14: syntax error
  MyDynamicInterface(); //                                   //# 14: continued
} //                                                         //# 14: continued

class F {
  factory MyBoolInterface() { return null; } //     //# 02: continued
  factory MyNumInterface() { return null; } //      //# 04: continued
  factory MyIntInterface() { return null; } //      //# 06: continued
  factory MyDoubleInterface() { return null; } //   //# 08: continued
  factory MyStringInterface() { return null; } //   //# 10: continued
  factory MyFunctionInterface() { return null; } // //# 12: continued
  factory MyDynamicInterface() { return null; } //  //# 14: continued
}

main() {
  new MyBool(); //             //# 01: continued
  new MyBoolInterface(); //    //# 02: continued
  new MyNum(); //              //# 03: continued
  new MyNumInterface(); //     //# 04: continued
  new MyInt(); //              //# 05: continued
  new MyIntInterface(); //     //# 06: continued
  new MyDouble(); //           //# 07: continued
  new MyDoubleInterface(); //  //# 08: continued
  new MyString(); //           //# 09: continued
  new MyStringInterface(); //  //# 10: continued
  new MyFunction();
  new MyOtherFunction();
  new MyFunctionInterface(); //# 12: continued
  new MyDynamic(); //          //# 13: continued
  new MyDynamicInterface(); // //# 14: continued
}
