-
Bug
-
Resolution: Fixed
-
P3
-
repo-valhalla
A verifier error occurs when this program is compiled and run.
A value class that extends an abstract value class results in a VerifierError when passed as an argument.
If the superclass is not abstract, the program succeeds.
Error Text:
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
AbstractValueClass.main([Ljava/lang/String;)V @6: invokevirtual
Reason:
Type 'AbstractValueClass$A' (current frame, stack[1]) is not assignable to 'AbstractValueClass$T'
Current Frame:
bci: @6
flags: { }
locals: { '[Ljava/lang/String;', 'AbstractValueClass$A' }
stack: { 'AbstractValueClass$A', 'AbstractValueClass$A' }
Bytecode:
0000000: b800 074c 2b2b b600 0cb1
The source is:
public class AbstractValueClass {
public static void main(String[] args) {
A a = new A();
a.doit(a);
}
public static abstract value class T {
public abstract void doit(T t);
}
public static final value class A extends T {
public void doit(T t) {
System.out.println(t);
}
}
public static final value class B extends T {
public void doit(T t) {
System.out.println(t);
}
}
}
A value class that extends an abstract value class results in a VerifierError when passed as an argument.
If the superclass is not abstract, the program succeeds.
Error Text:
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
AbstractValueClass.main([Ljava/lang/String;)V @6: invokevirtual
Reason:
Type 'AbstractValueClass$A' (current frame, stack[1]) is not assignable to 'AbstractValueClass$T'
Current Frame:
bci: @6
flags: { }
locals: { '[Ljava/lang/String;', 'AbstractValueClass$A' }
stack: { 'AbstractValueClass$A', 'AbstractValueClass$A' }
Bytecode:
0000000: b800 074c 2b2b b600 0cb1
The source is:
public class AbstractValueClass {
public static void main(String[] args) {
A a = new A();
a.doit(a);
}
public static abstract value class T {
public abstract void doit(T t);
}
public static final value class A extends T {
public void doit(T t) {
System.out.println(t);
}
}
public static final value class B extends T {
public void doit(T t) {
System.out.println(t);
}
}
}