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