// 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 denylisted 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
}
