aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-07-22 22:20:53 +0200
committerMartin Odersky <odersky@gmail.com>2016-07-22 22:21:02 +0200
commit7b1fc312fbaeafbeb1eadc080be1aa2e905963e2 (patch)
treec4313fe24b49df31d790d28252cf49dab23e09bf /src
parent80a65f4b2512bdf1dc46144bea1c000d39319872 (diff)
downloaddotty-7b1fc312fbaeafbeb1eadc080be1aa2e905963e2.tar.gz
dotty-7b1fc312fbaeafbeb1eadc080be1aa2e905963e2.tar.bz2
dotty-7b1fc312fbaeafbeb1eadc080be1aa2e905963e2.zip
Fix #1263: Suppress super initializer call for val parameters of traits.
Val-parameters of traits don't have an initializer, as other vals do. So we cannot call the initializer in an initialization sequence of a subclass. Fixes #1263.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/transform/Mixin.scala14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala
index b0d1e5c5f..8cdc82f7a 100644
--- a/src/dotty/tools/dotc/transform/Mixin.scala
+++ b/src/dotty/tools/dotc/transform/Mixin.scala
@@ -182,8 +182,8 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
}
}
- def wasDeferred(sym: Symbol) =
- ctx.atPhase(thisTransform) { implicit ctx => sym is Deferred }
+ def was(sym: Symbol, flags: FlagSet) =
+ ctx.atPhase(thisTransform) { implicit ctx => sym is flags }
def traitInits(mixin: ClassSymbol): List[Tree] = {
var argNum = 0
@@ -202,7 +202,7 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
EmptyTree
}
- for (getter <- mixin.info.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList) yield {
+ for (getter <- mixin.info.decls.toList if getter.isGetter && !was(getter, Deferred)) yield {
val isScala2x = mixin.is(Scala2x)
def default = Underscore(getter.info.resultType)
def initial = transformFollowing(superRef(initializer(getter)).appliedToNone)
@@ -220,23 +220,23 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
if (isCurrent(getter) || getter.is(ExpandedName)) {
val rhs =
- if (ctx.atPhase(thisTransform)(implicit ctx => getter.is(ParamAccessor))) nextArgument()
+ if (was(getter, ParamAccessor)) nextArgument()
else if (isScala2x)
if (getter.is(Lazy, butNot = Module)) lazyGetterCall
else if (getter.is(Module))
New(getter.info.resultType, List(This(cls)))
else Underscore(getter.info.resultType)
- else transformFollowing(superRef(initializer(getter)).appliedToNone)
+ else initial
// transformFollowing call is needed to make memoize & lazy vals run
transformFollowing(DefDef(implementation(getter.asTerm), rhs))
}
- else if (isScala2x) EmptyTree
+ else if (isScala2x || was(getter, ParamAccessor)) EmptyTree
else initial
}
}
def setters(mixin: ClassSymbol): List[Tree] =
- for (setter <- mixin.info.decls.filter(setr => setr.isSetter && !wasDeferred(setr)).toList)
+ for (setter <- mixin.info.decls.filter(setr => setr.isSetter && !was(setr, Deferred)).toList)
yield transformFollowing(DefDef(implementation(setter.asTerm), unitLiteral.withPos(cls.pos)))
cpy.Template(impl)(