1 /*
  2  * @test /nodynamiccopyright/
  3  * @bug 8194743
  4  * @summary Permit additional statements before this/super in constructors
  5  * @enablePreview
  6  * @compile/fail/ref=SuperInitFails.out -XDrawDiagnostics SuperInitFails.java
  7  * @build InitializationWarningTester
  8  * @run main InitializationWarningTester SuperInitFails SuperInitFailsWarnings.out
  9  */
 10 import java.util.concurrent.atomic.AtomicReference;
 11 public class SuperInitFails extends AtomicReference<Object> implements Iterable<Object> {
 12 
 13     private int x;
 14 
 15 /// GOOD EXAMPLES
 16 
 17     public SuperInitFails() {           // this should be OK
 18     }
 19 
 20     public SuperInitFails(Object x) {
 21         this.x = x.hashCode();          // this should be OK
 22     }
 23 
 24     public SuperInitFails(byte x) {
 25         super();                        // this should be OK
 26     }
 27 
 28     public SuperInitFails(char x) {
 29         this((int)x);                   // this should be OK
 30     }
 31 
 32 /// FAIL EXAMPLES
 33 
 34     {
 35         this(1);                        // this should FAIL
 36     }
 37 
 38     {
 39         super();                        // this should FAIL
 40     }
 41 
 42     void normalMethod1() {
 43         super();                        // this should FAIL
 44     }
 45 
 46     void normalMethod2() {
 47         this();                         // this should FAIL
 48     }
 49 
 50     void normalMethod3() {
 51         Runnable r = () -> super();     // this should FAIL
 52     }
 53 
 54     void normalMethod4() {
 55         Runnable r = () -> this();      // this should FAIL
 56     }
 57 
 58     public SuperInitFails(short x) {
 59         hashCode();                     // this should FAIL
 60         super();
 61     }
 62 
 63     public SuperInitFails(float x) {
 64         this.hashCode();                // this should FAIL
 65         super();
 66     }
 67 
 68     public SuperInitFails(int x) {
 69         super.hashCode();               // this should FAIL
 70         super();
 71     }
 72 
 73     public SuperInitFails(long x) {
 74         SuperInitFails.this.hashCode();      // this should FAIL
 75         super();
 76     }
 77 
 78     public SuperInitFails(double x) {
 79         SuperInitFails.super.hashCode();     // this should FAIL
 80         super();
 81     }
 82 
 83     public SuperInitFails(byte[] x) {
 84         {
 85             super();                    // this should FAIL
 86         }
 87     }
 88 
 89     public SuperInitFails(char[] x) {
 90         if (x.length == 0)
 91             return;                     // this should FAIL
 92         super();
 93     }
 94 
 95     public SuperInitFails(short[] x) {
 96         this.x++;                       // this should FAIL
 97         super();
 98     }
 99 
100     public SuperInitFails(float[] x) {
101         System.identityHashCode(this);  // this should FAIL
102         super();
103     }
104 
105     public SuperInitFails(int[] x) {
106         this(this);                     // this should FAIL
107     }
108 
109     public SuperInitFails(long[] x) {
110         this(Object.this);              // this should FAIL
111     }
112 
113     public SuperInitFails(double[] x) {
114         Iterable.super.spliterator();   // this should FAIL
115         super();
116     }
117 
118     public SuperInitFails(byte[][] x) {
119         super(new Object() {
120             {
121                 super();                // this should FAIL
122             }
123         });
124     }
125 
126     public SuperInitFails(char[][] x) {
127         new Inner1();                   // this should FAIL
128         super();
129     }
130 
131     class Inner1 {
132     }
133 
134     record Record1(int value) {
135         Record1(float x) {              // this should FAIL
136         }
137     }
138 
139     record Record2(int value) {
140         Record2(float x) {              // this should FAIL
141             super();
142         }
143     }
144 
145     @Override
146     public java.util.Iterator<Object> iterator() {
147         return null;
148     }
149 
150     public SuperInitFails(float[][] x) {
151         Runnable r = () -> {
152             super();                    // this should FAIL
153         };
154     }
155 
156     public SuperInitFails(int[][] z) {
157         super((Runnable)() -> System.err.println(x));       // this should FAIL
158     }
159 
160     public SuperInitFails(long[][] z) {
161         super(new Inner1());            // this should FAIL
162     }
163 
164     public static class Inner2 {
165         int x;
166     }
167     public static class Inner3 extends Inner2 {
168         int y;
169         Inner3(byte z) {
170             x = z;                      // this should FAIL
171             super();
172         }
173         Inner3(short z) {
174             this.x = z;                 // this should FAIL
175             super();
176         }
177         Inner3(char z) {
178             Inner3.this.x = z;          // this should FAIL
179             super();
180         }
181         Inner3(int z) {
182             super.x = z;                // this should FAIL
183             super();
184         }
185     }
186 
187     public SuperInitFails(double[][] x) {
188         Runnable r = () -> this.x = 7;  // this should FAIL
189         super();
190     }
191 
192     public int xx;
193 
194     SuperInitFails(short[][] ignore) {
195         int i = new SuperInitFails(){
196             void foo() {
197                 System.err.println(xx);  // this one is OK, reading field `xx` in the anonymous class
198             }
199         }.xx;  // this one is OK too, field of a fully constructed class
200         super(null);
201     }
202 
203     public static class Inner4 {
204         Inner4() {
205             Runnable r = () -> {
206                 class A {
207                     A() {
208                         return;         // this should FAIL
209                         super();
210                     }
211                     A(int x) {
212                         {
213                             this();     // this should FAIL
214                         }
215                     }
216                     A(char x) {
217                         super();
218                         this();         // this should FAIL
219                     }
220                 }
221             };
222             super();
223         };
224     }
225 
226     static class Inner5 {
227         int x = 4;
228         static String m1(Runnable r) { return null; }
229         static String m2(Object r) { return null; }
230         Inner5() {
231             m1(() -> System.out.println(x)).toString();
232             m2(x).toString();
233             super();
234         }
235     }
236 
237     static class Inner6 {
238         Inner6() {
239             class Bar {
240                 Bar() {
241                     Object o = Bar.this;
242                     super();
243                 }
244             }
245             super();
246         }
247     }
248 }