diff options
author | Martin Odersky <odersky@gmail.com> | 2016-03-02 17:52:50 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-03-02 17:53:01 +0100 |
commit | 25da2152f89c9c8a25188222fa395951b064e639 (patch) | |
tree | c5e000bab2f45be22d4075bb737d6d0a6a83fb86 /src/dotty/tools | |
parent | 69b6b892793e45a7158d006cdfb5554edc5db633 (diff) | |
download | dotty-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.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/LambdaLift.scala | 6 |
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. |