Skip to content

Commit

Permalink
Tweak parameter accessor scheme (#19719)
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
  • Loading branch information
SethTisue authored Feb 19, 2024
2 parents ca88156 + e6b726b commit bbedb45
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 @@ -116,7 +116,8 @@ class PostTyper extends MacroTransform with InfoTransformer { 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 bbedb45

Please sign in to comment.