Skip to content

Commit

Permalink
Tweak parameter accessor scheme
Browse files Browse the repository at this point in the history
To qualify as a super-parameter alias, a parameter of a subclass has to be
passed to the primary constructor of the superclass.

Fixes #19711

[Cherry-picked e6b726b]
  • Loading branch information
odersky authored and WojciechMazur committed Jul 2, 2024
1 parent 6c9e52f commit 0127f13
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
3 changes: 2 additions & 1 deletion compiler/src/dotty/tools/dotc/transform/PostTyper.scala
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase
* This info is used in phase ParamForwarding
*/
private def forwardParamAccessors(impl: Template)(using Context): Unit = impl.parents match
case superCall @ Apply(fn, superArgs) :: _ if superArgs.nonEmpty =>
case superCall @ Apply(fn, superArgs) :: _
if superArgs.nonEmpty && fn.symbol.isPrimaryConstructor =>
fn.tpe.widen match
case MethodType(superParamNames) =>
for case stat: ValDef <- impl.body do
Expand Down
29 changes: 29 additions & 0 deletions tests/run/i19711.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
class Foo(val s: Any):
def this(s: String) =
this(0)
class Bar(s: String) extends Foo(s):
def foo = s

class Foo2(val s: Any)
class Bar2(s: String) extends Foo2(s):
def foo = s

case class Config(_config: String)

abstract class Foo3(val config: Config) {
def this(config: String) = {
this(Config(config))
}
}

class Bar3(config: String) extends Foo3(config) {
def foo(): Unit = {
config.getClass()
}
}


@main def Test =
Bar("").foo
Bar2("").foo
Bar3("").foo()

0 comments on commit 0127f13

Please # to comment.