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