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