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