/*
javac --enable-preview --source 25 --add-exports java.base/jdk.internal.misc=ALL-UNNAMED PutFlatValueCrash.java
java -ea --enable-preview --add-exports java.base/jdk.internal.misc=ALL-UNNAMED -XX:-UseArrayFlattening -Xcomp -XX:CompileCommand=compileonly,"PutFlatValueCrash::test" -XX:-TieredCompilation PutFlatValueCrash
 */

import jdk.internal.misc.Unsafe;
import java.lang.reflect.Field;

public class PutFlatValueCrash {
    static public value class SmallValue {
        byte a;
        byte b;
        SmallValue(int a, int b) {
            this.a = (byte)a;
            this.b = (byte)b;
        }
    }

    SmallValue f;
    private static final long OFFSET;
    private static final boolean IS_FLATTENED;
    private static final int LAYOUT;
    static private final Unsafe U = Unsafe.getUnsafe();
    static {
        try {
            Field f = PutFlatValueCrash.class.getDeclaredField("f");
            OFFSET = U.objectFieldOffset(f);
            IS_FLATTENED = U.isFlatField(f);
            LAYOUT = U.fieldLayout(f);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public void test(boolean flag) {
        assert IS_FLATTENED;
        var newVal = new SmallValue(1, 1);
        var oldVal = new SmallValue(0, 0);
        f = oldVal;
        if (flag) {
            U.compareAndSetFlatValue(this, OFFSET, LAYOUT, SmallValue.class, oldVal, newVal);
        }
    }

    static public void main() {
        new SmallValue(0, 0);
        new PutFlatValueCrash().test(false);
    }
}