- 
    Type:
Bug
 - 
    Resolution: Fixed
 - 
    Priority:
  P4                     
     - 
    Affects Version/s: repo-valhalla
 - 
    Component/s: tools
 
                    According to JLS,
It is a compile-time error if a final variable is also declared volatile.
Fields in value classes are implicitly final, so the compiler should reject volatile keyword in this context.
However, the following code compiles:
value class VC {
volatile int f = 1;
}
public void main() {
new VC();
}
And then a ClassFormatError is thrown in runtime:
Exception in thread "main" java.lang.ClassFormatError: Illegal field modifiers (fields cannot be final and volatile) in class Main$VC: 0x850
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1026)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:528)
at Main.main(Main.java:6)
It is a compile-time error if a final variable is also declared volatile.
Fields in value classes are implicitly final, so the compiler should reject volatile keyword in this context.
However, the following code compiles:
value class VC {
volatile int f = 1;
}
public void main() {
new VC();
}
And then a ClassFormatError is thrown in runtime:
Exception in thread "main" java.lang.ClassFormatError: Illegal field modifiers (fields cannot be final and volatile) in class Main$VC: 0x850
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1026)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:528)
at Main.main(Main.java:6)
- links to
 - 
                    
        
        Commit(lworld)
        openjdk/valhalla/37ddfeec
    
 - 
                    
        
        Review(lworld)
        openjdk/valhalla/1297