duke@1: /* duke@1: * @test /nodynamiccopyright/ duke@1: * @bug 4319507 4785453 duke@1: * @summary Verify correct implementation of JLS2e 6.6.2.1 duke@1: * @author maddox duke@1: * jjg@611: * @compile/fail/ref=ProtectedMemberAccess4.out -XDdiags=-simpleNames -XDdiagsFormat=%b:%l:%_%m ProtectedMemberAccess4.java duke@1: */ duke@1: duke@1: // 33 errors expected. duke@1: duke@1: import pkg.SuperClass; duke@1: duke@1: class ProtectedMemberAccess4 extends pkg.SuperClass { duke@1: duke@1: // Access to a protected instance (non-static) field, instance method, duke@1: // or member type by a qualified name is always legal in a subclass of duke@1: // the class in which the member is declared. Such access to a protected duke@1: // instance field or instance method is allowed only if the qualifying type duke@1: // or the type of the qualifying expression is (a subclass of) the class duke@1: // in which the reference occurs. In this test case, the qualifying type duke@1: // is a superclass, thus all of the qualified references to instance fields duke@1: // and instance methods are illegal. duke@1: duke@1: pkg.SuperClass x = new pkg.SuperClass(); duke@1: duke@1: static pkg.SuperClass sx = new pkg.SuperClass(); duke@1: duke@1: int i = x.pi; // illegal duke@1: int j = x.spi; // ok duke@1: duke@1: int n = sx.pi; // illegal duke@1: int m = sx.spi; // ok duke@1: duke@1: static int sn = sx.pi; // illegal duke@1: static int sm = sx.spi; // ok duke@1: duke@1: int w = x.pm(); // illegal duke@1: int y = x.spm(); // ok duke@1: duke@1: int u = sx.pm(); // illegal duke@1: int v = sx.spm(); // ok duke@1: duke@1: pkg.SuperClass.pC obj1; // ok duke@1: pkg.SuperClass.spC obj2; // ok duke@1: duke@1: pkg.SuperClass.pI obj3; // ok duke@1: pkg.SuperClass.spI obj4; // ok duke@1: duke@1: Object o1 = (pkg.SuperClass.pC) null; // ok duke@1: Object o2 = (pkg.SuperClass.spC) null; // ok duke@1: duke@1: Object o3 = (pkg.SuperClass.pI) null; // ok duke@1: Object o4 = (pkg.SuperClass.spI) null; // ok duke@1: duke@1: class C1 extends pkg.SuperClass.pC {} // ok duke@1: class C2 extends pkg.SuperClass.spC {} // ok duke@1: duke@1: interface I1 extends pkg.SuperClass.pI {} // ok duke@1: interface I2 extends pkg.SuperClass.spI {} // ok duke@1: duke@1: static { duke@1: duke@1: pkg.SuperClass lx = new pkg.SuperClass(); duke@1: duke@1: sx.pi = 1; // illegal duke@1: sx.spi = 2; // ok duke@1: duke@1: lx.pi = 1; // illegal duke@1: lx.spi = 2; // ok duke@1: duke@1: int n = sx.pi; // illegal duke@1: int m = sx.spi; // ok duke@1: duke@1: int k = lx.pi; // illegal duke@1: int l = lx.spi; // ok duke@1: duke@1: int u = sx.pm(); // illegal duke@1: int v = sx.spm(); // ok duke@1: duke@1: int w = lx.pm(); // illegal duke@1: int z = lx.spm(); // ok duke@1: duke@1: pkg.SuperClass.pC obj1; // ok duke@1: pkg.SuperClass.spC obj2; // ok duke@1: duke@1: pkg.SuperClass.pI obj3; // ok duke@1: pkg.SuperClass.spI obj4; // ok duke@1: duke@1: Object o1 = (pkg.SuperClass.pC) null; // ok duke@1: Object o2 = (pkg.SuperClass.spC) null; // ok duke@1: duke@1: Object o3 = (pkg.SuperClass.pI) null; // ok duke@1: Object o4 = (pkg.SuperClass.spI) null; // ok duke@1: duke@1: //class C1 extends pkg.SuperClass.pC {} duke@1: class C2 extends pkg.SuperClass.spC {} // ok duke@1: duke@1: //interface I1 extends pkg.SuperClass.pI {} duke@1: //interface I2 extends pkg.SuperClass.spI {} duke@1: duke@1: } duke@1: duke@1: void m() { duke@1: duke@1: pkg.SuperClass lx = new pkg.SuperClass(); duke@1: duke@1: x.pi = 1; // illegal duke@1: x.spi = 2; // ok duke@1: duke@1: sx.pi = 1; // illegal duke@1: sx.spi = 2; // ok duke@1: duke@1: lx.pi = 1; // illegal duke@1: lx.spi = 2; // ok duke@1: duke@1: int t = x.pm(); // illegal duke@1: int y = x.spm(); // ok duke@1: duke@1: int u = sx.pm(); // illegal duke@1: int v = sx.spm(); // ok duke@1: duke@1: int w = lx.pm(); // illegal duke@1: int z = lx.spm(); // ok duke@1: duke@1: int i = x.pi; // illegal duke@1: int j = x.spi; // ok duke@1: duke@1: int n = sx.pi; // illegal duke@1: int m = sx.spi; // ok duke@1: duke@1: int k = lx.pi; // illegal duke@1: int l = lx.spi; // ok duke@1: duke@1: pkg.SuperClass.pC obj1; // ok duke@1: pkg.SuperClass.spC obj2; // ok duke@1: duke@1: pkg.SuperClass.pI obj3; // ok duke@1: pkg.SuperClass.spI obj4; // ok duke@1: duke@1: Object o1 = (pkg.SuperClass.pC) null; // ok duke@1: Object o2 = (pkg.SuperClass.spC) null; // ok duke@1: duke@1: Object o3 = (pkg.SuperClass.pI) null; // ok duke@1: Object o4 = (pkg.SuperClass.spI) null; // ok duke@1: duke@1: class C1 extends pkg.SuperClass.pC {} // ok duke@1: class C2 extends pkg.SuperClass.spC {} // ok duke@1: duke@1: //interface I1 extends pkg.SuperClass.pI {} duke@1: //interface I2 extends pkg.SuperClass.spI {} duke@1: duke@1: } duke@1: duke@1: class Inner { duke@1: duke@1: int i = x.pi; // illegal duke@1: int j = x.spi; // ok duke@1: duke@1: int n = sx.pi; // illegal duke@1: int m = sx.spi; // ok duke@1: duke@1: //static int sn = sx.pi; duke@1: //static int sm = sx.spi; duke@1: duke@1: int w = x.pm(); // illegal duke@1: int y = x.spm(); // ok duke@1: duke@1: int u = sx.pm(); // illegal duke@1: int v = sx.spm(); // ok duke@1: duke@1: pkg.SuperClass.pC obj1; // ok duke@1: pkg.SuperClass.spC obj2; // ok duke@1: duke@1: pkg.SuperClass.pI obj3; // ok duke@1: pkg.SuperClass.spI obj4; // ok duke@1: duke@1: Object o1 = (pkg.SuperClass.pC) null; // ok duke@1: Object o2 = (pkg.SuperClass.spC) null; // ok duke@1: duke@1: Object o3 = (pkg.SuperClass.pI) null; // ok duke@1: Object o4 = (pkg.SuperClass.spI) null; // ok duke@1: duke@1: class C1 extends pkg.SuperClass.pC {} // ok duke@1: class C2 extends pkg.SuperClass.spC {} // ok duke@1: duke@1: //interface I1 extends pkg.SuperClass.pI {} duke@1: //interface I2 extends pkg.SuperClass.spI {} duke@1: duke@1: // Not allowed in inner classes. duke@1: // static { ... } duke@1: duke@1: void m() { duke@1: duke@1: pkg.SuperClass lx = new pkg.SuperClass(); duke@1: duke@1: x.pi = 1; // illegal duke@1: x.spi = 2; // ok duke@1: duke@1: sx.pi = 1; // illegal duke@1: sx.spi = 2; // ok duke@1: duke@1: lx.pi = 1; // illegal duke@1: lx.spi = 2; // ok duke@1: duke@1: int t = x.pm(); // illegal duke@1: int y = x.spm(); // ok duke@1: duke@1: int u = sx.pm(); // illegal duke@1: int v = sx.spm(); // ok duke@1: duke@1: int w = lx.pm(); // illegal duke@1: int z = lx.spm(); // ok duke@1: duke@1: int i = x.pi; // illegal duke@1: int j = x.spi; // ok duke@1: duke@1: int n = sx.pi; // illegal duke@1: int m = sx.spi; // ok duke@1: duke@1: int k = lx.pi; // illegal duke@1: int l = lx.spi; // ok duke@1: duke@1: pkg.SuperClass.pC obj1; // ok duke@1: pkg.SuperClass.spC obj2; // ok duke@1: duke@1: pkg.SuperClass.pI obj3; // ok duke@1: pkg.SuperClass.spI obj4; // ok duke@1: duke@1: Object o1 = (pkg.SuperClass.pC) null; // ok duke@1: Object o2 = (pkg.SuperClass.spC) null; // ok duke@1: duke@1: Object o3 = (pkg.SuperClass.pI) null; // ok duke@1: Object o4 = (pkg.SuperClass.spI) null; // ok duke@1: duke@1: class C1 extends pkg.SuperClass.pC {} // ok duke@1: class C2 extends pkg.SuperClass.spC {} // ok duke@1: duke@1: //interface I1 extends pkg.SuperClass.pI {} duke@1: //interface I2 extends pkg.SuperClass.spI {} duke@1: duke@1: } duke@1: duke@1: } duke@1: duke@1: }