duke@1: /* duke@1: * @test /nodynamiccopyright/ duke@1: * @bug 4037746 4277279 4350658 4785453 duke@1: * @summary Verify that an inner class cannot have the same simple name as an enclosing one. duke@1: * @author William Maddox (maddox) duke@1: * jjg@611: * @compile/fail/ref=NestedInnerClassNames.out -XDrawDiagnostics NestedInnerClassNames.java duke@1: */ duke@1: duke@1: /* duke@1: * This program should compile with errors as marked. duke@1: */ duke@1: duke@1: public class NestedInnerClassNames { duke@1: duke@1: class NestedInnerClassNames {} // ERROR duke@1: duke@1: void m1() { duke@1: class NestedInnerClassNames {} // ERROR duke@1: } duke@1: duke@1: class foo { duke@1: class foo { } // ERROR duke@1: } duke@1: duke@1: void m2 () { duke@1: class foo { duke@1: class foo { } // ERROR duke@1: } duke@1: } duke@1: duke@1: class bar { duke@1: class foo { } duke@1: class NestedInnerClassNames {} // ERROR duke@1: } duke@1: duke@1: void m3() { duke@1: class bar { duke@1: class foo { } duke@1: class NestedInnerClassNames {} // ERROR duke@1: } duke@1: } duke@1: duke@1: class baz { duke@1: class baz { // ERROR duke@1: class baz { } // ERROR duke@1: } duke@1: } duke@1: duke@1: void m4() { duke@1: class baz { duke@1: class baz { // ERROR duke@1: class baz { } // ERROR duke@1: } duke@1: } duke@1: } duke@1: duke@1: class foo$bar { duke@1: class foo$bar { // ERROR duke@1: class foo { } duke@1: class bar { } duke@1: } duke@1: } duke@1: duke@1: void m5() { duke@1: class foo$bar { duke@1: class foo$bar { // ERROR duke@1: class foo { } duke@1: class bar { } duke@1: } duke@1: } duke@1: } duke@1: duke@1: class $bar { duke@1: class foo { duke@1: class $bar { } // ERROR duke@1: } duke@1: } duke@1: duke@1: void m6() { duke@1: class $bar { duke@1: class foo { duke@1: class $bar { } // ERROR duke@1: } duke@1: } duke@1: } duke@1: duke@1: class bar$bar { duke@1: class bar { duke@1: class bar{ } // ERROR duke@1: } duke@1: } duke@1: duke@1: void m7() { duke@1: class bar$bar { duke@1: class bar { duke@1: class bar{ } // ERROR duke@1: } duke@1: } duke@1: } duke@1: duke@1: // The name of the class below clashes with the name of the duke@1: // class created above for 'class foo { class foo {} }'. duke@1: // The clash follows from the naming requirements of the inner duke@1: // classes spec, but is most likely a specification bug. duke@1: duke@1: // Error may be reported here. See 4278961. duke@1: // As of Merlin-beta b21, this now results in an error. duke@1: class foo$foo { } // ERROR duke@1: duke@1: }