Skip to content

Commit fe36073

Browse files
authored
Merge pull request #1410 from dotty-staging/fix-#1263
Fix #1263: Suppress super initializer call for val parameters of traits.
2 parents 79e0fe0 + 66b0455 commit fe36073

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

src/dotty/tools/dotc/transform/Mixin.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,8 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
182182
}
183183
}
184184

185-
def wasDeferred(sym: Symbol) =
186-
ctx.atPhase(thisTransform) { implicit ctx => sym is Deferred }
185+
def was(sym: Symbol, flags: FlagSet) =
186+
ctx.atPhase(thisTransform) { implicit ctx => sym is flags }
187187

188188
def traitInits(mixin: ClassSymbol): List[Tree] = {
189189
var argNum = 0
@@ -202,7 +202,7 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
202202
EmptyTree
203203
}
204204

205-
for (getter <- mixin.info.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList) yield {
205+
for (getter <- mixin.info.decls.toList if getter.isGetter && !was(getter, Deferred)) yield {
206206
val isScala2x = mixin.is(Scala2x)
207207
def default = Underscore(getter.info.resultType)
208208
def initial = transformFollowing(superRef(initializer(getter)).appliedToNone)
@@ -220,23 +220,23 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
220220

221221
if (isCurrent(getter) || getter.is(ExpandedName)) {
222222
val rhs =
223-
if (ctx.atPhase(thisTransform)(implicit ctx => getter.is(ParamAccessor))) nextArgument()
223+
if (was(getter, ParamAccessor)) nextArgument()
224224
else if (isScala2x)
225225
if (getter.is(Lazy, butNot = Module)) lazyGetterCall
226226
else if (getter.is(Module))
227227
New(getter.info.resultType, List(This(cls)))
228228
else Underscore(getter.info.resultType)
229-
else transformFollowing(superRef(initializer(getter)).appliedToNone)
229+
else initial
230230
// transformFollowing call is needed to make memoize & lazy vals run
231231
transformFollowing(DefDef(implementation(getter.asTerm), rhs))
232232
}
233-
else if (isScala2x) EmptyTree
233+
else if (isScala2x || was(getter, ParamAccessor)) EmptyTree
234234
else initial
235235
}
236236
}
237237

238238
def setters(mixin: ClassSymbol): List[Tree] =
239-
for (setter <- mixin.info.decls.filter(setr => setr.isSetter && !wasDeferred(setr)).toList)
239+
for (setter <- mixin.info.decls.filter(setr => setr.isSetter && !was(setr, Deferred)).toList)
240240
yield transformFollowing(DefDef(implementation(setter.asTerm), unitLiteral.withPos(cls.pos)))
241241

242242
cpy.Template(impl)(

tests/run/i1263.scala

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
object Test {
2+
trait Foo(val s: String)
3+
4+
val foo1 = new Foo("bar") {}
5+
val foo2 = new Foo { override val s = "bar" }
6+
def main(args: Array[String]): Unit = {
7+
assert(foo1.s == "bar")
8+
assert(foo2.s == "bar")
9+
}
10+
}
11+
object Test1 {
12+
trait Foo(private val s0: String) {
13+
def s = s0
14+
}
15+
16+
val foo1 = new Foo("bar") {}
17+
def main(args: Array[String]): Unit = {
18+
assert(foo1.s == "bar")
19+
}
20+
}
21+
object Test2 {
22+
trait Foo(protected val s: String)
23+
24+
val foo1 = new Foo("bar") {}
25+
val foo2 = new Foo { override val s = "bar" }
26+
}
27+
object Test3 {
28+
trait Foo(final val s: String)
29+
30+
val foo1 = new Foo("bar") {}
31+
def main(args: Array[String]): Unit = {
32+
assert(foo1.s == "bar")
33+
}
34+
}

0 commit comments

Comments
 (0)