1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/test/tools/javac/protectedAccess/ProtectedMemberAccess4.java Wed Apr 27 01:34:52 2016 +0800 1.3 @@ -0,0 +1,246 @@ 1.4 +/* 1.5 + * @test /nodynamiccopyright/ 1.6 + * @bug 4319507 4785453 1.7 + * @summary Verify correct implementation of JLS2e 6.6.2.1 1.8 + * @author maddox 1.9 + * 1.10 + * @compile/fail/ref=ProtectedMemberAccess4.out -XDdiags=-simpleNames -XDdiagsFormat=%b:%l:%_%m ProtectedMemberAccess4.java 1.11 + */ 1.12 + 1.13 +// 33 errors expected. 1.14 + 1.15 +import pkg.SuperClass; 1.16 + 1.17 +class ProtectedMemberAccess4 extends pkg.SuperClass { 1.18 + 1.19 + // Access to a protected instance (non-static) field, instance method, 1.20 + // or member type by a qualified name is always legal in a subclass of 1.21 + // the class in which the member is declared. Such access to a protected 1.22 + // instance field or instance method is allowed only if the qualifying type 1.23 + // or the type of the qualifying expression is (a subclass of) the class 1.24 + // in which the reference occurs. In this test case, the qualifying type 1.25 + // is a superclass, thus all of the qualified references to instance fields 1.26 + // and instance methods are illegal. 1.27 + 1.28 + pkg.SuperClass x = new pkg.SuperClass(); 1.29 + 1.30 + static pkg.SuperClass sx = new pkg.SuperClass(); 1.31 + 1.32 + int i = x.pi; // illegal 1.33 + int j = x.spi; // ok 1.34 + 1.35 + int n = sx.pi; // illegal 1.36 + int m = sx.spi; // ok 1.37 + 1.38 + static int sn = sx.pi; // illegal 1.39 + static int sm = sx.spi; // ok 1.40 + 1.41 + int w = x.pm(); // illegal 1.42 + int y = x.spm(); // ok 1.43 + 1.44 + int u = sx.pm(); // illegal 1.45 + int v = sx.spm(); // ok 1.46 + 1.47 + pkg.SuperClass.pC obj1; // ok 1.48 + pkg.SuperClass.spC obj2; // ok 1.49 + 1.50 + pkg.SuperClass.pI obj3; // ok 1.51 + pkg.SuperClass.spI obj4; // ok 1.52 + 1.53 + Object o1 = (pkg.SuperClass.pC) null; // ok 1.54 + Object o2 = (pkg.SuperClass.spC) null; // ok 1.55 + 1.56 + Object o3 = (pkg.SuperClass.pI) null; // ok 1.57 + Object o4 = (pkg.SuperClass.spI) null; // ok 1.58 + 1.59 + class C1 extends pkg.SuperClass.pC {} // ok 1.60 + class C2 extends pkg.SuperClass.spC {} // ok 1.61 + 1.62 + interface I1 extends pkg.SuperClass.pI {} // ok 1.63 + interface I2 extends pkg.SuperClass.spI {} // ok 1.64 + 1.65 + static { 1.66 + 1.67 + pkg.SuperClass lx = new pkg.SuperClass(); 1.68 + 1.69 + sx.pi = 1; // illegal 1.70 + sx.spi = 2; // ok 1.71 + 1.72 + lx.pi = 1; // illegal 1.73 + lx.spi = 2; // ok 1.74 + 1.75 + int n = sx.pi; // illegal 1.76 + int m = sx.spi; // ok 1.77 + 1.78 + int k = lx.pi; // illegal 1.79 + int l = lx.spi; // ok 1.80 + 1.81 + int u = sx.pm(); // illegal 1.82 + int v = sx.spm(); // ok 1.83 + 1.84 + int w = lx.pm(); // illegal 1.85 + int z = lx.spm(); // ok 1.86 + 1.87 + pkg.SuperClass.pC obj1; // ok 1.88 + pkg.SuperClass.spC obj2; // ok 1.89 + 1.90 + pkg.SuperClass.pI obj3; // ok 1.91 + pkg.SuperClass.spI obj4; // ok 1.92 + 1.93 + Object o1 = (pkg.SuperClass.pC) null; // ok 1.94 + Object o2 = (pkg.SuperClass.spC) null; // ok 1.95 + 1.96 + Object o3 = (pkg.SuperClass.pI) null; // ok 1.97 + Object o4 = (pkg.SuperClass.spI) null; // ok 1.98 + 1.99 + //class C1 extends pkg.SuperClass.pC {} 1.100 + class C2 extends pkg.SuperClass.spC {} // ok 1.101 + 1.102 + //interface I1 extends pkg.SuperClass.pI {} 1.103 + //interface I2 extends pkg.SuperClass.spI {} 1.104 + 1.105 + } 1.106 + 1.107 + void m() { 1.108 + 1.109 + pkg.SuperClass lx = new pkg.SuperClass(); 1.110 + 1.111 + x.pi = 1; // illegal 1.112 + x.spi = 2; // ok 1.113 + 1.114 + sx.pi = 1; // illegal 1.115 + sx.spi = 2; // ok 1.116 + 1.117 + lx.pi = 1; // illegal 1.118 + lx.spi = 2; // ok 1.119 + 1.120 + int t = x.pm(); // illegal 1.121 + int y = x.spm(); // ok 1.122 + 1.123 + int u = sx.pm(); // illegal 1.124 + int v = sx.spm(); // ok 1.125 + 1.126 + int w = lx.pm(); // illegal 1.127 + int z = lx.spm(); // ok 1.128 + 1.129 + int i = x.pi; // illegal 1.130 + int j = x.spi; // ok 1.131 + 1.132 + int n = sx.pi; // illegal 1.133 + int m = sx.spi; // ok 1.134 + 1.135 + int k = lx.pi; // illegal 1.136 + int l = lx.spi; // ok 1.137 + 1.138 + pkg.SuperClass.pC obj1; // ok 1.139 + pkg.SuperClass.spC obj2; // ok 1.140 + 1.141 + pkg.SuperClass.pI obj3; // ok 1.142 + pkg.SuperClass.spI obj4; // ok 1.143 + 1.144 + Object o1 = (pkg.SuperClass.pC) null; // ok 1.145 + Object o2 = (pkg.SuperClass.spC) null; // ok 1.146 + 1.147 + Object o3 = (pkg.SuperClass.pI) null; // ok 1.148 + Object o4 = (pkg.SuperClass.spI) null; // ok 1.149 + 1.150 + class C1 extends pkg.SuperClass.pC {} // ok 1.151 + class C2 extends pkg.SuperClass.spC {} // ok 1.152 + 1.153 + //interface I1 extends pkg.SuperClass.pI {} 1.154 + //interface I2 extends pkg.SuperClass.spI {} 1.155 + 1.156 + } 1.157 + 1.158 + class Inner { 1.159 + 1.160 + int i = x.pi; // illegal 1.161 + int j = x.spi; // ok 1.162 + 1.163 + int n = sx.pi; // illegal 1.164 + int m = sx.spi; // ok 1.165 + 1.166 + //static int sn = sx.pi; 1.167 + //static int sm = sx.spi; 1.168 + 1.169 + int w = x.pm(); // illegal 1.170 + int y = x.spm(); // ok 1.171 + 1.172 + int u = sx.pm(); // illegal 1.173 + int v = sx.spm(); // ok 1.174 + 1.175 + pkg.SuperClass.pC obj1; // ok 1.176 + pkg.SuperClass.spC obj2; // ok 1.177 + 1.178 + pkg.SuperClass.pI obj3; // ok 1.179 + pkg.SuperClass.spI obj4; // ok 1.180 + 1.181 + Object o1 = (pkg.SuperClass.pC) null; // ok 1.182 + Object o2 = (pkg.SuperClass.spC) null; // ok 1.183 + 1.184 + Object o3 = (pkg.SuperClass.pI) null; // ok 1.185 + Object o4 = (pkg.SuperClass.spI) null; // ok 1.186 + 1.187 + class C1 extends pkg.SuperClass.pC {} // ok 1.188 + class C2 extends pkg.SuperClass.spC {} // ok 1.189 + 1.190 + //interface I1 extends pkg.SuperClass.pI {} 1.191 + //interface I2 extends pkg.SuperClass.spI {} 1.192 + 1.193 + // Not allowed in inner classes. 1.194 + // static { ... } 1.195 + 1.196 + void m() { 1.197 + 1.198 + pkg.SuperClass lx = new pkg.SuperClass(); 1.199 + 1.200 + x.pi = 1; // illegal 1.201 + x.spi = 2; // ok 1.202 + 1.203 + sx.pi = 1; // illegal 1.204 + sx.spi = 2; // ok 1.205 + 1.206 + lx.pi = 1; // illegal 1.207 + lx.spi = 2; // ok 1.208 + 1.209 + int t = x.pm(); // illegal 1.210 + int y = x.spm(); // ok 1.211 + 1.212 + int u = sx.pm(); // illegal 1.213 + int v = sx.spm(); // ok 1.214 + 1.215 + int w = lx.pm(); // illegal 1.216 + int z = lx.spm(); // ok 1.217 + 1.218 + int i = x.pi; // illegal 1.219 + int j = x.spi; // ok 1.220 + 1.221 + int n = sx.pi; // illegal 1.222 + int m = sx.spi; // ok 1.223 + 1.224 + int k = lx.pi; // illegal 1.225 + int l = lx.spi; // ok 1.226 + 1.227 + pkg.SuperClass.pC obj1; // ok 1.228 + pkg.SuperClass.spC obj2; // ok 1.229 + 1.230 + pkg.SuperClass.pI obj3; // ok 1.231 + pkg.SuperClass.spI obj4; // ok 1.232 + 1.233 + Object o1 = (pkg.SuperClass.pC) null; // ok 1.234 + Object o2 = (pkg.SuperClass.spC) null; // ok 1.235 + 1.236 + Object o3 = (pkg.SuperClass.pI) null; // ok 1.237 + Object o4 = (pkg.SuperClass.spI) null; // ok 1.238 + 1.239 + class C1 extends pkg.SuperClass.pC {} // ok 1.240 + class C2 extends pkg.SuperClass.spC {} // ok 1.241 + 1.242 + //interface I1 extends pkg.SuperClass.pI {} 1.243 + //interface I2 extends pkg.SuperClass.spI {} 1.244 + 1.245 + } 1.246 + 1.247 + } 1.248 + 1.249 +}