aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-03-02 17:52:50 +0100
committerMartin Odersky <odersky@gmail.com>2016-03-02 17:53:01 +0100
commit25da2152f89c9c8a25188222fa395951b064e639 (patch)
treec5e000bab2f45be22d4075bb737d6d0a6a83fb86 /src/dotty/tools
parent69b6b892793e45a7158d006cdfb5554edc5db633 (diff)
downloaddotty-25da2152f89c9c8a25188222fa395951b064e639.tar.gz
dotty-25da2152f89c9c8a25188222fa395951b064e639.tar.bz2
dotty-25da2152f89c9c8a25188222fa395951b064e639.zip
Fix call propagation from constructor to class
Diffstat (limited to 'src/dotty/tools')
-rw-r--r--src/dotty/tools/dotc/Compiler.scala2
-rw-r--r--src/dotty/tools/dotc/transform/LambdaLift.scala6
2 files changed, 4 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/Compiler.scala b/src/dotty/tools/dotc/Compiler.scala
index d526903b8..967fb395a 100644
--- a/src/dotty/tools/dotc/Compiler.scala
+++ b/src/dotty/tools/dotc/Compiler.scala
@@ -75,7 +75,7 @@ class Compiler {
new Constructors, // constructors changes decls in transformTemplate, no InfoTransformers should be added after it
new FunctionalInterfaces,
new GetClass), // getClass transformation should be applied to specialized methods
- List(new LambdaLift, // in this mini-phase block scopes are incorrect. No phases that rely on scopes should be here
+ List(new LambdaLift, // in this mini-phase block scopes are incorrect. No phases that rely on scopes should be here
new ElimStaticThis,
new Flatten,
// new DropEmptyCompanions,
diff --git a/src/dotty/tools/dotc/transform/LambdaLift.scala b/src/dotty/tools/dotc/transform/LambdaLift.scala
index dfc8c77dc..8b79bec58 100644
--- a/src/dotty/tools/dotc/transform/LambdaLift.scala
+++ b/src/dotty/tools/dotc/transform/LambdaLift.scala
@@ -133,7 +133,7 @@ class LambdaLift extends MiniPhase with IdentityDenotTransformer { thisTransform
val owner = sym.maybeOwner
owner.isTerm ||
owner.is(Trait) && isLocal(owner) ||
- sym.isConstructor && isLocal(sym.owner)
+ sym.isConstructor && isLocal(owner)
}
/** Set `liftedOwner(sym)` to `owner` if `owner` is more deeply nested
@@ -223,7 +223,7 @@ class LambdaLift extends MiniPhase with IdentityDenotTransformer { thisTransform
}
private def markCalled(callee: Symbol, caller: Symbol)(implicit ctx: Context): Unit = {
- ctx.debuglog(i"mark called: $callee of ${callee.owner} is called by $caller")
+ ctx.debuglog(i"mark called: $callee of ${callee.owner} is called by $caller in ${caller.owner}")
assert(isLocal(callee))
symSet(called, caller) += callee
if (callee.enclosingClass != caller.enclosingClass) calledFromInner += callee
@@ -261,7 +261,7 @@ class LambdaLift extends MiniPhase with IdentityDenotTransformer { thisTransform
// top-level class. This avoids possible deadlocks when a static method
// has to access its enclosing object from the outside.
else if (sym.isConstructor) {
- if (sym.isPrimaryConstructor && sym.owner.owner.isTerm && !sym.owner.is(Trait))
+ if (sym.isPrimaryConstructor && isLocal(sym.owner) && !sym.owner.is(Trait))
// add a call edge from the constructor of a local non-trait class to
// the class itself. This is done so that the constructor inherits
// the free variables of the class.