Skip to content

Final local classes are emitted as non-local #4404

Closed
@mbloms

Description

@mbloms

It seems like the flags of Anonymous classes are somehow lost during compilation. Despite these lines in Typer.scala:

val x = tpnme.ANON_CLASS
val clsDef = TypeDef(x, templ1).withFlags(Final)

Anonymous classes are compiled without the public final.

Compiling this:

class Car
final class Volvo extends Car

object Car {
    val car = new Car {}
}

with dotc yields this:

$ dotc Anon.scala 
$ javap Car Volvo 'Car$$anon$1'
Compiled from "Anon.scala"
public class Car {
  public static Car car();
  public Car();
}
Compiled from "Anon.scala"
public final class Volvo extends Car {
  public Volvo();
}
Compiled from "Anon.scala"
class Car$$anon$1 extends Car {
  public Car$$anon$1();
}

scalac instead yields this:

$ scalac Anon.scala 
$ javap Car Volvo 'Car$$anon$1'
Compiled from "Anon.scala"
public class Car {
  public static Car car();
  public Car();
}
Compiled from "Anon.scala"
public final class Volvo extends Car {
  public Volvo();
}
Compiled from "Anon.scala"
public final class Car$$anon$1 extends Car {
  public Car$$anon$1();
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions