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 }