duke@1: /* duke@1: * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as duke@1: * published by the Free Software Foundation. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * duke@1: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@1: * CA 95054 USA or visit www.sun.com if you need additional information or duke@1: * have any questions. duke@1: */ duke@1: duke@1: /* duke@1: * @test duke@1: * @bug 4319507 duke@1: * @summary Verify correct implementation of JLS2e 6.6.2.1 duke@1: * @author maddox duke@1: * duke@1: * @run compile ProtectedMemberAccess1.java duke@1: */ duke@1: duke@1: import pkg.SuperClass; duke@1: duke@1: class ProtectedMemberAccess1a extends SuperClass { duke@1: duke@1: // Access to a protected member via its simple name duke@1: // is always legal in a subclass of the class in duke@1: // which the member is declared. duke@1: duke@1: int i = pi; duke@1: int j = spi; duke@1: duke@1: int x = pm(); duke@1: int y = spm(); duke@1: duke@1: pC obj1; duke@1: spC obj2; duke@1: duke@1: pI obj3; duke@1: spI obj4; duke@1: duke@1: Object o1 = (pC) null; duke@1: Object o2 = (spC) null; duke@1: duke@1: Object o3 = (pI) null; duke@1: Object o4 = (spI) null; duke@1: duke@1: class C1 extends pC {} duke@1: class C2 extends spC {} duke@1: duke@1: interface I1 extends pI {} duke@1: interface I2 extends spI {} duke@1: duke@1: static { duke@1: duke@1: spi = 2; duke@1: duke@1: int y = spm(); duke@1: duke@1: pC obj1; duke@1: spC obj2; duke@1: duke@1: pI obj3; duke@1: spI obj4; duke@1: duke@1: Object o1 = (pC) null; duke@1: Object o2 = (spC) null; duke@1: duke@1: Object o3 = (pI) null; duke@1: Object o4 = (spI) null; duke@1: duke@1: //class C1 extends pC {} duke@1: class C2 extends spC {} duke@1: duke@1: //interface I1 extends pI {} duke@1: //interface I2 extends spI {} duke@1: duke@1: } duke@1: duke@1: void m() { duke@1: duke@1: pi = 1; duke@1: spi = 2; duke@1: duke@1: int x = pm(); duke@1: int y = spm(); duke@1: duke@1: pC obj1; duke@1: spC obj2; duke@1: duke@1: pI obj3; duke@1: spI obj4; duke@1: duke@1: Object o1 = (pC) null; duke@1: Object o2 = (spC) null; duke@1: duke@1: Object o3 = (pI) null; duke@1: Object o4 = (spI) null; duke@1: duke@1: class C1 extends pC {} duke@1: class C2 extends spC {} duke@1: duke@1: //interface I1 extends pI {} duke@1: //interface I2 extends spI {} duke@1: duke@1: } duke@1: duke@1: class Inner { duke@1: duke@1: int i = pi; duke@1: int j = spi; duke@1: duke@1: int x = pm(); duke@1: int y = spm(); duke@1: duke@1: pC obj1; duke@1: spC obj2; duke@1: duke@1: pI obj3; duke@1: spI obj4; duke@1: duke@1: Object o1 = (pC) null; duke@1: Object o2 = (spC) null; duke@1: duke@1: Object o3 = (pI) null; duke@1: Object o4 = (spI) null; duke@1: duke@1: class C1 extends pC {} duke@1: class C2 extends spC {} duke@1: duke@1: //interface I1 extends pI {} duke@1: //interface I2 extends spI {} duke@1: duke@1: // Not allowed in inner classes. duke@1: // static { ... } duke@1: duke@1: void m() { duke@1: duke@1: pi = 1; duke@1: spi = 2; duke@1: duke@1: int x = pm(); duke@1: int y = spm(); duke@1: duke@1: pC obj1; duke@1: spC obj2; duke@1: duke@1: pI obj3; duke@1: spI obj4; duke@1: duke@1: Object o1 = (pC) null; duke@1: Object o2 = (spC) null; duke@1: duke@1: Object o3 = (pI) null; duke@1: Object o4 = (spI) null; duke@1: duke@1: class C1 extends pC {} duke@1: class C2 extends spC {} duke@1: duke@1: //interface I1 extends pI {} duke@1: //interface I2 extends spI {} duke@1: } duke@1: } duke@1: duke@1: } duke@1: duke@1: class ProtectedMemberAccess2a 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 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. duke@1: duke@1: ProtectedMemberAccess2a x = duke@1: new ProtectedMemberAccess2a(); duke@1: duke@1: static ProtectedMemberAccess2a sx = duke@1: new ProtectedMemberAccess2a(); duke@1: duke@1: int i = x.pi; duke@1: int j = x.spi; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: static int sn = sx.pi; duke@1: static int sm = sx.spi; duke@1: duke@1: int w = x.pm(); duke@1: int y = x.spm(); duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: ProtectedMemberAccess2a.pC obj1; duke@1: ProtectedMemberAccess2a.spC obj2; duke@1: duke@1: ProtectedMemberAccess2a.pI obj3; duke@1: ProtectedMemberAccess2a.spI obj4; duke@1: duke@1: Object o1 = (ProtectedMemberAccess2a.pC) null; duke@1: Object o2 = (ProtectedMemberAccess2a.spC) null; duke@1: duke@1: Object o3 = (ProtectedMemberAccess2a.pI) null; duke@1: Object o4 = (ProtectedMemberAccess2a.spI) null; duke@1: duke@1: class C1 extends ProtectedMemberAccess2a.pC {} duke@1: class C2 extends ProtectedMemberAccess2a.spC {} duke@1: duke@1: interface I1 extends ProtectedMemberAccess2a.pI {} duke@1: interface I2 extends ProtectedMemberAccess2a.spI {} duke@1: duke@1: static { duke@1: duke@1: ProtectedMemberAccess2a lx = duke@1: new ProtectedMemberAccess2a(); duke@1: duke@1: sx.pi = 1; duke@1: sx.spi = 2; duke@1: duke@1: lx.pi = 1; duke@1: lx.spi = 2; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: int k = lx.pi; duke@1: int l = lx.spi; duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: int w = lx.pm(); duke@1: int z = lx.spm(); duke@1: duke@1: ProtectedMemberAccess2a.pC obj1; duke@1: ProtectedMemberAccess2a.spC obj2; duke@1: duke@1: ProtectedMemberAccess2a.pI obj3; duke@1: ProtectedMemberAccess2a.spI obj4; duke@1: duke@1: Object o1 = (ProtectedMemberAccess2a.pC) null; duke@1: Object o2 = (ProtectedMemberAccess2a.spC) null; duke@1: duke@1: Object o3 = (ProtectedMemberAccess2a.pI) null; duke@1: Object o4 = (ProtectedMemberAccess2a.spI) null; duke@1: duke@1: //class C1 extends ProtectedMemberAccess2a.pC {} duke@1: class C2 extends ProtectedMemberAccess2a.spC {} duke@1: duke@1: //interface I1 extends ProtectedMemberAccess2a.pI {} duke@1: //interface I2 extends ProtectedMemberAccess2a.spI {} duke@1: duke@1: } duke@1: duke@1: void m() { duke@1: duke@1: ProtectedMemberAccess2a lx = duke@1: new ProtectedMemberAccess2a(); duke@1: duke@1: x.pi = 1; duke@1: x.spi = 2; duke@1: duke@1: sx.pi = 1; duke@1: sx.spi = 2; duke@1: duke@1: lx.pi = 1; duke@1: lx.spi = 2; duke@1: duke@1: int t = x.pm(); duke@1: int y = x.spm(); duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: int w = lx.pm(); duke@1: int z = lx.spm(); duke@1: duke@1: int i = x.pi; duke@1: int j = x.spi; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: int k = lx.pi; duke@1: int l = lx.spi; duke@1: duke@1: ProtectedMemberAccess2a.pC obj1; duke@1: ProtectedMemberAccess2a.spC obj2; duke@1: duke@1: ProtectedMemberAccess2a.pI obj3; duke@1: ProtectedMemberAccess2a.spI obj4; duke@1: duke@1: Object o1 = (ProtectedMemberAccess2a.pC) null; duke@1: Object o2 = (ProtectedMemberAccess2a.spC) null; duke@1: duke@1: Object o3 = (ProtectedMemberAccess2a.pI) null; duke@1: Object o4 = (ProtectedMemberAccess2a.spI) null; duke@1: duke@1: class C1 extends ProtectedMemberAccess2a.pC {} duke@1: class C2 extends ProtectedMemberAccess2a.spC {} duke@1: duke@1: //interface I1 extends ProtectedMemberAccess2a.pI {} duke@1: //interface I2 extends ProtectedMemberAccess2a.spI {} duke@1: duke@1: } duke@1: duke@1: class Inner { duke@1: duke@1: int i = x.pi; duke@1: int j = x.spi; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: //static int sn = sx.pi; duke@1: //static int sm = sx.spi; duke@1: duke@1: int w = x.pm(); duke@1: int y = x.spm(); duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: ProtectedMemberAccess2a.pC obj1; duke@1: ProtectedMemberAccess2a.spC obj2; duke@1: duke@1: ProtectedMemberAccess2a.pI obj3; duke@1: ProtectedMemberAccess2a.spI obj4; duke@1: duke@1: Object o1 = (ProtectedMemberAccess2a.pC) null; duke@1: Object o2 = (ProtectedMemberAccess2a.spC) null; duke@1: duke@1: Object o3 = (ProtectedMemberAccess2a.pI) null; duke@1: Object o4 = (ProtectedMemberAccess2a.spI) null; duke@1: duke@1: class C1 extends ProtectedMemberAccess2a.pC {} duke@1: class C2 extends ProtectedMemberAccess2a.spC {} duke@1: duke@1: //interface I1 extends ProtectedMemberAccess2a.pI {} duke@1: //interface I2 extends ProtectedMemberAccess2a.spI {} duke@1: duke@1: // Not allowed in inner classes. duke@1: // static { ... } duke@1: duke@1: void m() { duke@1: duke@1: ProtectedMemberAccess2a lx = duke@1: new ProtectedMemberAccess2a(); duke@1: duke@1: x.pi = 1; duke@1: x.spi = 2; duke@1: duke@1: sx.pi = 1; duke@1: sx.spi = 2; duke@1: duke@1: lx.pi = 1; duke@1: lx.spi = 2; duke@1: duke@1: int t = x.pm(); duke@1: int y = x.spm(); duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: int w = lx.pm(); duke@1: int z = lx.spm(); duke@1: duke@1: int i = x.pi; duke@1: int j = x.spi; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: int k = lx.pi; duke@1: int l = lx.spi; duke@1: duke@1: ProtectedMemberAccess2a.pC obj1; duke@1: ProtectedMemberAccess2a.spC obj2; duke@1: duke@1: ProtectedMemberAccess2a.pI obj3; duke@1: ProtectedMemberAccess2a.spI obj4; duke@1: duke@1: Object o1 = (ProtectedMemberAccess2a.pC) null; duke@1: Object o2 = (ProtectedMemberAccess2a.spC) null; duke@1: duke@1: Object o3 = (ProtectedMemberAccess2a.pI) null; duke@1: Object o4 = (ProtectedMemberAccess2a.spI) null; duke@1: duke@1: class C1 extends ProtectedMemberAccess2a.pC {} duke@1: class C2 extends ProtectedMemberAccess2a.spC {} duke@1: duke@1: //interface I1 extends ProtectedMemberAccess2a.pI {} duke@1: //interface I2 extends ProtectedMemberAccess2a.spI {} duke@1: duke@1: } duke@1: duke@1: } duke@1: duke@1: } duke@1: duke@1: duke@1: class SubClass extends ProtectedMemberAccess3a { } duke@1: duke@1: class ProtectedMemberAccess3a 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 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. duke@1: duke@1: SubClass x = new SubClass(); duke@1: duke@1: static SubClass sx = new SubClass(); duke@1: duke@1: int i = x.pi; duke@1: int j = x.spi; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: static int sn = sx.pi; duke@1: static int sm = sx.spi; duke@1: duke@1: int w = x.pm(); duke@1: int y = x.spm(); duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: SubClass.pC obj1; duke@1: SubClass.spC obj2; duke@1: duke@1: SubClass.pI obj3; duke@1: SubClass.spI obj4; duke@1: duke@1: Object o1 = (SubClass.pC) null; duke@1: Object o2 = (SubClass.spC) null; duke@1: duke@1: Object o3 = (SubClass.pI) null; duke@1: Object o4 = (SubClass.spI) null; duke@1: duke@1: class C1 extends SubClass.pC {} duke@1: class C2 extends SubClass.spC {} duke@1: duke@1: interface I1 extends SubClass.pI {} duke@1: interface I2 extends SubClass.spI {} duke@1: duke@1: static { duke@1: duke@1: SubClass lx = new SubClass(); duke@1: duke@1: sx.pi = 1; duke@1: sx.spi = 2; duke@1: duke@1: lx.pi = 1; duke@1: lx.spi = 2; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: int k = lx.pi; duke@1: int l = lx.spi; duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: int w = lx.pm(); duke@1: int z = lx.spm(); duke@1: duke@1: SubClass.pC obj1; duke@1: SubClass.spC obj2; duke@1: duke@1: SubClass.pI obj3; duke@1: SubClass.spI obj4; duke@1: duke@1: Object o1 = (SubClass.pC) null; duke@1: Object o2 = (SubClass.spC) null; duke@1: duke@1: Object o3 = (SubClass.pI) null; duke@1: Object o4 = (SubClass.spI) null; duke@1: duke@1: //class C1 extends SubClass.pC {} duke@1: class C2 extends SubClass.spC {} duke@1: duke@1: //interface I1 extends SubClass.pI {} duke@1: //interface I2 extends SubClass.spI {} duke@1: duke@1: } duke@1: duke@1: void m() { duke@1: duke@1: SubClass lx = new SubClass(); duke@1: duke@1: x.pi = 1; duke@1: x.spi = 2; duke@1: duke@1: sx.pi = 1; duke@1: sx.spi = 2; duke@1: duke@1: lx.pi = 1; duke@1: lx.spi = 2; duke@1: duke@1: int t = x.pm(); duke@1: int y = x.spm(); duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: int w = lx.pm(); duke@1: int z = lx.spm(); duke@1: duke@1: int i = x.pi; duke@1: int j = x.spi; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: int k = lx.pi; duke@1: int l = lx.spi; duke@1: duke@1: SubClass.pC obj1; duke@1: SubClass.spC obj2; duke@1: duke@1: SubClass.pI obj3; duke@1: SubClass.spI obj4; duke@1: duke@1: Object o1 = (SubClass.pC) null; duke@1: Object o2 = (SubClass.spC) null; duke@1: duke@1: Object o3 = (SubClass.pI) null; duke@1: Object o4 = (SubClass.spI) null; duke@1: duke@1: class C1 extends SubClass.pC {} duke@1: class C2 extends SubClass.spC {} duke@1: duke@1: //interface I1 extends SubClass.pI {} duke@1: //interface I2 extends SubClass.spI {} duke@1: duke@1: } duke@1: duke@1: class Inner { duke@1: duke@1: int i = x.pi; duke@1: int j = x.spi; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: //static int sn = sx.pi; duke@1: //static int sm = sx.spi; duke@1: duke@1: int w = x.pm(); duke@1: int y = x.spm(); duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: SubClass.pC obj1; duke@1: SubClass.spC obj2; duke@1: duke@1: SubClass.pI obj3; duke@1: SubClass.spI obj4; duke@1: duke@1: Object o1 = (SubClass.pC) null; duke@1: Object o2 = (SubClass.spC) null; duke@1: duke@1: Object o3 = (SubClass.pI) null; duke@1: Object o4 = (SubClass.spI) null; duke@1: duke@1: class C1 extends SubClass.pC {} duke@1: class C2 extends SubClass.spC {} duke@1: duke@1: //interface I1 extends SubClass.pI {} duke@1: //interface I2 extends SubClass.spI {} duke@1: duke@1: // Not allowed in inner classes. duke@1: // static { ... } duke@1: duke@1: void m() { duke@1: duke@1: SubClass lx = new SubClass(); duke@1: duke@1: x.pi = 1; duke@1: x.spi = 2; duke@1: duke@1: sx.pi = 1; duke@1: sx.spi = 2; duke@1: duke@1: lx.pi = 1; duke@1: lx.spi = 2; duke@1: duke@1: int t = x.pm(); duke@1: int y = x.spm(); duke@1: duke@1: int u = sx.pm(); duke@1: int v = sx.spm(); duke@1: duke@1: int w = lx.pm(); duke@1: int z = lx.spm(); duke@1: duke@1: int i = x.pi; duke@1: int j = x.spi; duke@1: duke@1: int n = sx.pi; duke@1: int m = sx.spi; duke@1: duke@1: int k = lx.pi; duke@1: int l = lx.spi; duke@1: duke@1: SubClass.pC obj1; duke@1: SubClass.spC obj2; duke@1: duke@1: SubClass.pI obj3; duke@1: SubClass.spI obj4; duke@1: duke@1: Object o1 = (SubClass.pC) null; duke@1: Object o2 = (SubClass.spC) null; duke@1: duke@1: Object o3 = (SubClass.pI) null; duke@1: Object o4 = (SubClass.spI) null; duke@1: duke@1: class C1 extends SubClass.pC {} duke@1: class C2 extends SubClass.spC {} duke@1: duke@1: //interface I1 extends SubClass.pI {} duke@1: //interface I2 extends SubClass.spI {} duke@1: duke@1: } duke@1: duke@1: } duke@1: duke@1: }