Skip to content

-release flag does not set -target level #12625

@ghost

Description

Compilation done using JDK 11.0.16. Target bytecode level is JDK 10 (54.0 as per https://javaalmanac.io/bytecode/versions/).

Java:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

Compilation: javac --release 10 HelloWorld.java

Output: javap -v HelloWorld:

Classfile /Users/vasil.vasilev/scratch/HelloWorld.class
  Last modified Jul 26, 2022; size 427 bytes
  MD5 checksum 17d024f395aebe2e6764dc846e444557
  Compiled from "HelloWorld.java"
public class HelloWorld
  minor version: 0
  major version: 54
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #5                          // HelloWorld
  super_class: #6                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 2, attributes: 1

Result: Bytecode level 54.0 (JDK 10), as set by --release 10. Works as expected.

Scala 2.13.8

Source:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello, world!")
  }
}

Compilation: scalac --release 10 HelloWorld.scala

Output: javap -v HelloWorld

Classfile /Users/vasil.vasilev/scratch/HelloWorld.class
  Last modified Jul 26, 2022; size 706 bytes
  MD5 checksum a8ec501d0aebe643501d2a1cc86737ae
  Compiled from "HelloWorld.scala"
public final class HelloWorld
  minor version: 0
  major version: 52
  flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
  this_class: #2                          // HelloWorld
  super_class: #4                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 1, attributes: 3

Result: Bytecode level 52.0 (JDK 8), as set by --release 10. Not working as expected.

Scala 2.13.8 with -target:10

Source:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello, world!")
  }
}

Compilation: scalac --release 10 -target:10 HelloWorld.scala

Output: javap -v HelloWorld

Classfile /Users/vasil.vasilev/scratch/HelloWorld.class
  Last modified Jul 26, 2022; size 706 bytes
  MD5 checksum 2cca1e5977d802a020635061d2a4698f
  Compiled from "HelloWorld.scala"
public final class HelloWorld
  minor version: 0
  major version: 54
  flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
  this_class: #2                          // HelloWorld
  super_class: #4                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 1, attributes: 3

Result: Bytecode level 54.0 (JDK 10), as set by --release 10 -target:10. Works as expected.

Scala 3.1.3

Source:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello, world!")
  }
}

Compilation: scalac --release 10 HelloWorld.scala

Output: javap -v HelloWorld

Classfile /Users/vasil.vasilev/scratch/HelloWorld.class
  Last modified Jul 26, 2022; size 302 bytes
  MD5 checksum 3c1fd2e887d87c7040b4351c6eda45c8
  Compiled from "HelloWorld.scala"
public final class HelloWorld
  minor version: 0
  major version: 54
  flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
  this_class: #2                          // HelloWorld
  super_class: #4                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 1, attributes: 3

Result: Bytecode level 54.0 (JDK 10), as set by --release 10 -target:10. Works as expected.

Scala 2.12.16

Source:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello, world!")
  }
}

Compilation: scalac -release 10 HelloWorld.scala

Output: javap -v HelloWorld

Classfile /Users/vasil.vasilev/scratch/HelloWorld.class
  Last modified Jul 26, 2022; size 645 bytes
  MD5 checksum f20ce23243e3c27a4aa64c2727e3f823
  Compiled from "HelloWorld.scala"
public final class HelloWorld
  minor version: 0
  major version: 52
  flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
  this_class: #2                          // HelloWorld
  super_class: #4                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 1, attributes: 3

Result: Bytecode level 52.0 (JDK 8), as set by -release 10. Not working as expected.

Scala 2.12.16 with -target:10

Source:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello, world!")
  }
}

Compilation: scalac -release 10 -target:10 HelloWorld.scala

Output: javap -v HelloWorld

Classfile /Users/vasil.vasilev/scratch/HelloWorld.class
  Last modified Jul 26, 2022; size 645 bytes
  MD5 checksum 0686cefff7da55d8c5f0a381ccee6543
  Compiled from "HelloWorld.scala"
public final class HelloWorld
  minor version: 0
  major version: 54
  flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
  this_class: #2                          // HelloWorld
  super_class: #4                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 1, attributes: 3

Result: Bytecode level 54.0 (JDK 10), as set by -release 10 -target:10. Works as expected.

Conclusion

Scala 2, while it does respect the --release flag, it doesn't set the -target flag with it. Java does. Scala 3 does.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions