/* * @test /nodynamiccopyright/ * @bug 8194743 * @summary Permit additional statements before this/super in constructors * @compile/fail/ref=SuperInitFails.out -XDrawDiagnostics SuperInitFails.java * @enablePreview */ import java.util.concurrent.atomic.AtomicReference; public class SuperInitFails extends AtomicReference implements Iterable { private int x; /// GOOD EXAMPLES public SuperInitFails() { // this should be OK } public SuperInitFails(Object x) { this.x = x.hashCode(); // this should be OK } public SuperInitFails(byte x) { super(); // this should be OK } public SuperInitFails(char x) { this((int)x); // this should be OK } /// FAIL EXAMPLES { this(1); // this should FAIL } { super(); // this should FAIL } void normalMethod1() { super(); // this should FAIL } void normalMethod2() { this(); // this should FAIL } void normalMethod3() { Runnable r = () -> super(); // this should FAIL } void normalMethod4() { Runnable r = () -> this(); // this should FAIL } public SuperInitFails(short x) { hashCode(); // this should FAIL super(); } public SuperInitFails(float x) { this.hashCode(); // this should FAIL super(); } public SuperInitFails(int x) { super.hashCode(); // this should FAIL super(); } public SuperInitFails(long x) { SuperInitFails.this.hashCode(); // this should FAIL super(); } public SuperInitFails(double x) { SuperInitFails.super.hashCode(); // this should FAIL super(); } public SuperInitFails(byte[] x) { { super(); // this should FAIL } } public SuperInitFails(char[] x) { if (x.length == 0) return; // this should FAIL super(); } public SuperInitFails(short[] x) { this.x++; // this should FAIL super(); } public SuperInitFails(float[] x) { System.identityHashCode(this); // this should FAIL super(); } public SuperInitFails(int[] x) { this(this); // this should FAIL } public SuperInitFails(long[] x) { this(Object.this); // this should FAIL } public SuperInitFails(double[] x) { Iterable.super.spliterator(); // this should FAIL super(); } public SuperInitFails(byte[][] x) { super(new Object() { { super(); // this should FAIL } }); } public SuperInitFails(char[][] x) { new Inner1(); // this should FAIL super(); } class Inner1 { } record Record1(int value) { Record1(float x) { // this should FAIL } } record Record2(int value) { Record2(float x) { // this should FAIL super(); } } @Override public java.util.Iterator iterator() { return null; } public SuperInitFails(float[][] x) { Runnable r = () -> { super(); // this should FAIL }; } public SuperInitFails(int[][] z) { super((Runnable)() -> x); // this should FAIL } public SuperInitFails(long[][] z) { super(new Inner1()); // this should FAIL } public static class Inner2 { int x; } public static class Inner3 extends Inner2 { int y; Inner3(byte z) { x = z; // this should FAIL super(); } Inner3(short z) { this.x = z; // this should FAIL super(); } Inner3(char z) { Inner3.this.x = z; // this should FAIL super(); } Inner3(int z) { super.x = z; // this should FAIL super(); } } public SuperInitFails(double[][] x) { Runnable r = () -> this.x = 7; // this should FAIL super(); } }