Closed
Description
Compiler version
3.0.1-RC2
Minimized code 1
class Foo inline (s: String)
Output 1
1 |class Foo inline (s: String)
| ^^^^^^
| end of statement expected but identifier found
Minimized code 2
class Bar(i: Int):
inline def this() = this(0)
val bar = Bar()
Output 2 (click arrow to expand)
Error while emitting rs$line$1
Exception in thread "main" java.lang.RuntimeException: Unexpected New(...Bar/TypeTree[TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class repl$)),object rs$line$1),class rs$line$1$Bar)]) reached GenBCode.
Call was genLoad(New(TypeTree[TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class repl$)),object rs$line$1),class rs$line$1$Bar)]),Lrepl$/rs$line$1$Bar;)
at dotty.tools.backend.jvm.BCodeHelpers.abort(BCodeHelpers.scala:937)
at dotty.tools.backend.jvm.BCodeHelpers.abort$(BCodeHelpers.scala:41)
at dotty.tools.backend.jvm.GenBCodePipeline.abort(GenBCode.scala:81)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:319)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:290)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genStat(BCodeBodyBuilder.scala:96)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genBlock$$anonfun$1(BCodeBodyBuilder.scala:895)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.immutable.List.foreach(List.scala:333)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genBlock(BCodeBodyBuilder.scala:895)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:417)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genStat(BCodeBodyBuilder.scala:82)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genBlock$$anonfun$1(BCodeBodyBuilder.scala:895)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.immutable.List.foreach(List.scala:333)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genBlock(BCodeBodyBuilder.scala:895)
at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:417)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.emitNormalMethodBody$1(BCodeSkelBuilder.scala:765)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.genDefDef(BCodeSkelBuilder.scala:800)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen(BCodeSkelBuilder.scala:608)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen$$anonfun$1(BCodeSkelBuilder.scala:614)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.immutable.List.foreach(List.scala:333)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen(BCodeSkelBuilder.scala:614)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.genPlainClass(BCodeSkelBuilder.scala:229)
at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.visit(GenBCode.scala:229)
at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.run(GenBCode.scala:194)
at dotty.tools.backend.jvm.GenBCodePipeline.buildAndSendToDisk(GenBCode.scala:529)
at dotty.tools.backend.jvm.GenBCodePipeline.run(GenBCode.scala:495)
at dotty.tools.backend.jvm.GenBCode.run(GenBCode.scala:60)
at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:303)
at scala.collection.immutable.List.map(List.scala:246)
at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:304)
at dotty.tools.backend.jvm.GenBCode.runOn(GenBCode.scala:64)
at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:205)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
at dotty.tools.dotc.Run.runPhases$5(Run.scala:216)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:224)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
at dotty.tools.dotc.Run.compileUnits(Run.scala:231)
at dotty.tools.dotc.Run.compileUnits(Run.scala:172)
at dotty.tools.repl.ReplCompiler.runCompilationUnit(ReplCompiler.scala:152)
at dotty.tools.repl.ReplCompiler.compile(ReplCompiler.scala:162)
at dotty.tools.repl.ReplDriver.compile(ReplDriver.scala:249)
at dotty.tools.repl.ReplDriver.interpret(ReplDriver.scala:212)
at dotty.tools.repl.ReplDriver.loop$1(ReplDriver.scala:146)
at dotty.tools.repl.ReplDriver.runUntilQuit$$anonfun$1(ReplDriver.scala:149)
at dotty.tools.repl.ReplDriver.withRedirectedOutput(ReplDriver.scala:168)
at dotty.tools.repl.ReplDriver.runUntilQuit(ReplDriver.scala:149)
at dotty.tools.repl.ReplDriver.tryRunning(ReplDriver.scala:115)
at dotty.tools.repl.Main$.main(Main.scala:6)
at dotty.tools.repl.Main.main(Main.scala)
Expectations
Not sure if this should be reported as 2 separate issues because I don't know if there are any implementational limitations here by design or not.
First of all it seems syntactically impossible to define an inline primary constructor for a class (if it was I would assume this syntax to work per analogy to private constructors). It is however possible to define an inline secondary constructor but an attempt to invoke it crashes the compiler.
So basically I can see two options here:
- If inline constructors are for some reason problematic (and we don't want to support them yet or ever) then disallow defining secondary inline constructors and improve the error message for primary ones
- Otherwise make it possible to define inline primary constructors and prevent inline constructors in general from crashing the compiler