ProtectedMemberAccess4.java revision 3643:589ff4d43428
138494Sobrien/* 2174297Sobrien * @test /nodynamiccopyright/ 338494Sobrien * @bug 4319507 4785453 438494Sobrien * @summary Verify correct implementation of JLS2e 6.6.2.1 538494Sobrien * @author maddox 638494Sobrien * 738494Sobrien * @compile/fail/ref=ProtectedMemberAccess4.out --diags:formatterOptions=-simpleNames;layout=%b:%l:%_%m ProtectedMemberAccess4.java 838494Sobrien */ 938494Sobrien 1038494Sobrien// 33 errors expected. 1138494Sobrien 1238494Sobrienimport pkg.SuperClass; 1338494Sobrien 1438494Sobrienclass ProtectedMemberAccess4 extends pkg.SuperClass { 1538494Sobrien 1638494Sobrien // Access to a protected instance (non-static) field, instance method, 1738494Sobrien // or member type by a qualified name is always legal in a subclass of 1838494Sobrien // the class in which the member is declared. Such access to a protected 1938494Sobrien // instance field or instance method is allowed only if the qualifying type 2038494Sobrien // or the type of the qualifying expression is (a subclass of) the class 2138494Sobrien // in which the reference occurs. In this test case, the qualifying type 2238494Sobrien // is a superclass, thus all of the qualified references to instance fields 2338494Sobrien // and instance methods are illegal. 2438494Sobrien 2538494Sobrien pkg.SuperClass x = new pkg.SuperClass(); 2638494Sobrien 2738494Sobrien static pkg.SuperClass sx = new pkg.SuperClass(); 2838494Sobrien 2938494Sobrien int i = x.pi; // illegal 3038494Sobrien int j = x.spi; // ok 3138494Sobrien 3238494Sobrien int n = sx.pi; // illegal 3338494Sobrien int m = sx.spi; // ok 3438494Sobrien 3538494Sobrien static int sn = sx.pi; // illegal 3638494Sobrien static int sm = sx.spi; // ok 3738494Sobrien 3838494Sobrien int w = x.pm(); // illegal 3938494Sobrien int y = x.spm(); // ok 4038494Sobrien 41174297Sobrien int u = sx.pm(); // illegal 4251300Sobrien int v = sx.spm(); // ok 4338494Sobrien 44296194Strasz pkg.SuperClass.pC obj1; // ok 4539087Sobrien pkg.SuperClass.spC obj2; // ok 4639087Sobrien 4739087Sobrien pkg.SuperClass.pI obj3; // ok 4839087Sobrien pkg.SuperClass.spI obj4; // ok 4939087Sobrien 5039087Sobrien Object o1 = (pkg.SuperClass.pC) null; // ok 51174416Sru Object o2 = (pkg.SuperClass.spC) null; // ok 52174415Sru 5339087Sobrien Object o3 = (pkg.SuperClass.pI) null; // ok 5439087Sobrien Object o4 = (pkg.SuperClass.spI) null; // ok 5539087Sobrien 5639087Sobrien class C1 extends pkg.SuperClass.pC {} // ok 5739087Sobrien class C2 extends pkg.SuperClass.spC {} // ok 58174415Sru 5939087Sobrien interface I1 extends pkg.SuperClass.pI {} // ok 60296194Strasz interface I2 extends pkg.SuperClass.spI {} // ok 61296194Strasz 62296194Strasz static { 63296194Strasz 64296194Strasz pkg.SuperClass lx = new pkg.SuperClass(); 65296194Strasz 66296194Strasz sx.pi = 1; // illegal 67174415Sru sx.spi = 2; // ok 68174415Sru 69174415Sru lx.pi = 1; // illegal 7039087Sobrien lx.spi = 2; // ok 7139087Sobrien 7238494Sobrien int n = sx.pi; // illegal 7338494Sobrien int m = sx.spi; // ok 7439087Sobrien 7539087Sobrien int k = lx.pi; // illegal 76174415Sru int l = lx.spi; // ok 77174415Sru 78174415Sru int u = sx.pm(); // illegal 79174415Sru int v = sx.spm(); // ok 8039087Sobrien 8138494Sobrien int w = lx.pm(); // illegal 8239087Sobrien int z = lx.spm(); // ok 83174415Sru 84174415Sru pkg.SuperClass.pC obj1; // ok 85174415Sru pkg.SuperClass.spC obj2; // ok 86174415Sru 8739087Sobrien pkg.SuperClass.pI obj3; // ok 88174415Sru pkg.SuperClass.spI obj4; // ok 8939087Sobrien 90174415Sru Object o1 = (pkg.SuperClass.pC) null; // ok 9139087Sobrien Object o2 = (pkg.SuperClass.spC) null; // ok 92174415Sru 93147439Sru Object o3 = (pkg.SuperClass.pI) null; // ok 94174415Sru Object o4 = (pkg.SuperClass.spI) null; // ok 95174415Sru 9639087Sobrien //class C1 extends pkg.SuperClass.pC {} 97174415Sru class C2 extends pkg.SuperClass.spC {} // ok 98174415Sru 9939087Sobrien //interface I1 extends pkg.SuperClass.pI {} 100174415Sru //interface I2 extends pkg.SuperClass.spI {} 101174415Sru 102174415Sru } 10339087Sobrien 104147439Sru void m() { 105174415Sru 106174415Sru pkg.SuperClass lx = new pkg.SuperClass(); 107174415Sru 108147439Sru x.pi = 1; // illegal 109147439Sru x.spi = 2; // ok 11039087Sobrien 111174415Sru sx.pi = 1; // illegal 112174415Sru sx.spi = 2; // ok 113174415Sru 11439087Sobrien lx.pi = 1; // illegal 115174415Sru lx.spi = 2; // ok 116174415Sru 117174415Sru int t = x.pm(); // illegal 11839087Sobrien int y = x.spm(); // ok 11939087Sobrien 120174415Sru int u = sx.pm(); // illegal 121174415Sru int v = sx.spm(); // ok 122174415Sru 123174415Sru int w = lx.pm(); // illegal 124174415Sru int z = lx.spm(); // ok 125174415Sru 126174415Sru int i = x.pi; // illegal 12739087Sobrien int j = x.spi; // ok 12838494Sobrien 12939087Sobrien int n = sx.pi; // illegal 130174415Sru int m = sx.spi; // ok 13139087Sobrien 132174415Sru int k = lx.pi; // illegal 133174415Sru int l = lx.spi; // ok 134174415Sru 135174415Sru pkg.SuperClass.pC obj1; // ok 136174415Sru pkg.SuperClass.spC obj2; // ok 137174415Sru 138174415Sru pkg.SuperClass.pI obj3; // ok 139174415Sru pkg.SuperClass.spI obj4; // ok 14038494Sobrien 14139087Sobrien Object o1 = (pkg.SuperClass.pC) null; // ok 142174415Sru Object o2 = (pkg.SuperClass.spC) null; // ok 143174415Sru 144174415Sru Object o3 = (pkg.SuperClass.pI) null; // ok 145174415Sru Object o4 = (pkg.SuperClass.spI) null; // ok 146174415Sru 14738494Sobrien class C1 extends pkg.SuperClass.pC {} // ok 148174415Sru class C2 extends pkg.SuperClass.spC {} // ok 149174415Sru 150174415Sru //interface I1 extends pkg.SuperClass.pI {} 151174415Sru //interface I2 extends pkg.SuperClass.spI {} 152174415Sru 153174415Sru } 154174415Sru 155174415Sru class Inner { 156174415Sru 15739087Sobrien int i = x.pi; // illegal 158147439Sru int j = x.spi; // ok 15939087Sobrien 16038494Sobrien int n = sx.pi; // illegal 161169497Spav int m = sx.spi; // ok 162147439Sru 16339087Sobrien //static int sn = sx.pi; 16438494Sobrien //static int sm = sx.spi; 165174415Sru 166174415Sru int w = x.pm(); // illegal 16739087Sobrien int y = x.spm(); // ok 168147439Sru 169174415Sru int u = sx.pm(); // illegal 170174415Sru int v = sx.spm(); // ok 171174415Sru 172147439Sru pkg.SuperClass.pC obj1; // ok 173147439Sru pkg.SuperClass.spC obj2; // ok 174174415Sru 175174415Sru pkg.SuperClass.pI obj3; // ok 176174415Sru pkg.SuperClass.spI obj4; // ok 177174415Sru 178174415Sru Object o1 = (pkg.SuperClass.pC) null; // ok 179147439Sru Object o2 = (pkg.SuperClass.spC) null; // ok 180174415Sru 181147439Sru Object o3 = (pkg.SuperClass.pI) null; // ok 182174415Sru Object o4 = (pkg.SuperClass.spI) null; // ok 18339087Sobrien 18439087Sobrien class C1 extends pkg.SuperClass.pC {} // ok 185174415Sru class C2 extends pkg.SuperClass.spC {} // ok 18639087Sobrien 18739087Sobrien //interface I1 extends pkg.SuperClass.pI {} 18838494Sobrien //interface I2 extends pkg.SuperClass.spI {} 189174415Sru 190147439Sru // Not allowed in inner classes. 191147439Sru // static { ... } 192174415Sru 193174415Sru void m() { 19439087Sobrien 195147439Sru pkg.SuperClass lx = new pkg.SuperClass(); 196174415Sru 197147439Sru x.pi = 1; // illegal 19839087Sobrien x.spi = 2; // ok 199174415Sru 200174415Sru sx.pi = 1; // illegal 20139087Sobrien sx.spi = 2; // ok 20239087Sobrien 203174415Sru lx.pi = 1; // illegal 20439087Sobrien lx.spi = 2; // ok 20539087Sobrien 20638494Sobrien int t = x.pm(); // illegal 20739087Sobrien int y = x.spm(); // ok 20839087Sobrien 209174415Sru int u = sx.pm(); // illegal 210174415Sru int v = sx.spm(); // ok 211174415Sru 21238494Sobrien int w = lx.pm(); // illegal 21339087Sobrien int z = lx.spm(); // ok 21438494Sobrien 21539087Sobrien int i = x.pi; // illegal 216174415Sru int j = x.spi; // ok 21739087Sobrien 218174297Sobrien int n = sx.pi; // illegal 219174297Sobrien int m = sx.spi; // ok 220174415Sru 221174297Sobrien int k = lx.pi; // illegal 222174415Sru int l = lx.spi; // ok 223174297Sobrien 224174415Sru pkg.SuperClass.pC obj1; // ok 225174297Sobrien pkg.SuperClass.spC obj2; // ok 226174415Sru 227174297Sobrien pkg.SuperClass.pI obj3; // ok 228174415Sru pkg.SuperClass.spI obj4; // ok 229174297Sobrien 230174297Sobrien Object o1 = (pkg.SuperClass.pC) null; // ok 231174415Sru Object o2 = (pkg.SuperClass.spC) null; // ok 232174415Sru 233174297Sobrien Object o3 = (pkg.SuperClass.pI) null; // ok 234174297Sobrien Object o4 = (pkg.SuperClass.spI) null; // ok 235174297Sobrien 236174297Sobrien class C1 extends pkg.SuperClass.pC {} // ok 237174297Sobrien class C2 extends pkg.SuperClass.spC {} // ok 238174415Sru 239174297Sobrien //interface I1 extends pkg.SuperClass.pI {} 240174297Sobrien //interface I2 extends pkg.SuperClass.spI {} 241174297Sobrien 242174415Sru } 243174415Sru 244174297Sobrien } 245174297Sobrien 246174415Sru} 247174415Sru