1 /* 2 * @test /nodynamiccopyright/ 3 * @bug 8325805 4 * @summary Permit non-superclass instance field assignments before this/super in constructors 5 * @enablePreview 6 * @compile/fail/ref=EarlyAssignments.out -XDrawDiagnostics EarlyAssignments.java 7 * @build InitializationWarningTester 8 * @run main InitializationWarningTester EarlyAssignments EarlyAssignmentsWarnings.out 9 */ 10 public class EarlyAssignments { 11 12 public static class Inner1 { 13 public int x; 14 15 public Inner1() { 16 x = 123; // OK - "x" belongs to this class 17 this.x = 123; // OK - "x" belongs to this class 18 Inner1.this.x = 123; // OK - "x" belongs to this class 19 super(); 20 } 21 22 public Inner1(int y) { 23 y = x; // OK - "x" belongs to this class 24 y = this.x; // OK - "x" belongs to this class 25 y = Inner1.this.x; // OK - "x" belongs to this class 26 super(); 27 } 28 29 public class Inner1a extends Inner1 { 30 public int z; 31 public Inner1a(byte value) { 32 Inner1.this.x = value; // OK - "x" belongs to outer class 33 z = super.x; // FAIL - "x" belongs to superclass 34 z = x; // FAIL - "x" belongs to superclass 35 this.z = x; // FAIL - "x" belongs to superclass 36 Inner1a.this.z = x; // FAIL - "x" belongs to superclass 37 Object o1 = Inner1.this; // OK - Inner1 is an outer class 38 Object o2 = Inner1a.this; // FAIL - Inner1a is this class 39 super(); 40 } 41 public Inner1a(short value) { 42 x = value; // FAIL - "x" belongs to superclass 43 super(); 44 } 45 public Inner1a(char value) { 46 this.x = value; // FAIL - "x" belongs to superclass 47 super(); 48 } 49 public Inner1a(int value) { 50 super.x = value; // FAIL - "x" belongs to superclass 51 super(); 52 } 53 } 54 55 public class Inner1b { 56 public Inner1b(int value) { 57 Inner1.this.x = value; // OK - "x" belongs to outer class 58 super(); 59 } 60 } 61 } 62 63 public static class Inner2 extends Inner1 { 64 int y; 65 public Inner2(int value) { 66 y = value; // OK - "y" belongs to this class 67 this.y = value; // OK - "y" belongs to this class 68 x = value; // FAIL - "x" belongs to superclass 69 this.x = value; // FAIL - "x" belongs to superclass 70 Object o1 = this; // FAIL - can't acces 'this' yet 71 Object o2 = Inner2.this; // FAIL - can't acces 'this' yet 72 super(); 73 } 74 } 75 76 public static class Inner3 { 77 78 public int e; 79 80 public class Inner3a { 81 82 public static int x; 83 84 public Inner3a(int val) { 85 x = val; // OK - "x" is a static field 86 val = x; // OK - "x" is a static field 87 e = val; // OK - "e" belongs to outer class 88 val = e; // OK - "e" belongs to outer class 89 Inner3.this.e = val; // OK - "e" belongs to outer class 90 super(); 91 } 92 } 93 } 94 95 public static class Inner4 { 96 public int x; 97 98 public Inner4() { 99 x = 0; // OK 100 x = x + 1; // OK 101 super(); 102 } 103 104 public Inner4(int a) { 105 this.x = 0; // OK 106 this.x = this.x + 1; // OK 107 super(); 108 } 109 110 public Inner4(char a) { 111 Inner4.this.x = 0; // OK 112 Inner4.this.x = Inner4.this.x + 1; // OK 113 super(); 114 } 115 } 116 117 public static class Inner5 extends Inner4 { 118 public int y; 119 120 public Inner5() { 121 y = x + 1; // FAIL - illegal early access 122 super(); 123 } 124 125 public Inner5(int a) { 126 this.y = x + 1; // FAIL - illegal early access 127 super(); 128 } 129 130 public Inner5(char a) { 131 Inner5.this.y = x + 1; // FAIL - illegal early access 132 super(); 133 } 134 135 public Inner5(short a) { 136 y = super.x + 1; // FAIL - illegal early access 137 super(); 138 } 139 140 public Inner5(float a) { 141 y = Inner5.this.x + 1; // FAIL - illegal early access 142 super(); 143 } 144 } 145 146 public static class Inner6 { 147 public int x = 1; 148 149 public Inner6() { 150 x = 2; // FAIL - illegal early access 151 super(); 152 } 153 } 154 155 public static class Inner7 { 156 public final int x = 1; 157 158 public Inner7() { 159 x = 2; // FAIL - illegal early access 160 super(); 161 } 162 } 163 164 public static class Inner8 { 165 class Inner8a { 166 int x; 167 } 168 169 public Inner8() { 170 this.new Inner8a().x = 1; // FAIL - illegal early access 171 super(); 172 } 173 } 174 175 public static class Inner9 { 176 int x = 1; 177 int y; 178 Inner9() { 179 y = x; // FAIL, x has an initializer 180 super(); 181 } 182 } 183 }