aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Martres <smarter@ubuntu.com>2016-12-23 15:49:15 +0100
committerGuillaume Martres <smarter@ubuntu.com>2017-01-28 19:12:19 +0100
commit51a458efeeebfeed6c357d56cf8afe5b06e86724 (patch)
treef9ecc004ec43a08cc7247ef2f8784545ff32250c
parentdc5ba9d2ba31b2fe27f5b967c9fb800bc9210a93 (diff)
downloaddotty-51a458efeeebfeed6c357d56cf8afe5b06e86724.tar.gz
dotty-51a458efeeebfeed6c357d56cf8afe5b06e86724.tar.bz2
dotty-51a458efeeebfeed6c357d56cf8afe5b06e86724.zip
Workaround #1895: Bringing a symbol to a new run is broken
-rw-r--r--compiler/src/dotty/tools/dotc/core/SymDenotations.scala10
-rw-r--r--compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala9
-rw-r--r--tests/repl/vc.check5
3 files changed, 19 insertions, 5 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala
index aaae78c57..a3475e14c 100644
--- a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala
+++ b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala
@@ -45,9 +45,13 @@ trait SymDenotations { this: Context =>
else {
val initial = denot.initial
val firstPhaseId = initial.validFor.firstPhaseId.max(ctx.typerPhase.id)
- if ((initial ne denot) || ctx.phaseId != firstPhaseId)
- ctx.withPhase(firstPhaseId).stillValidInOwner(initial)
- else
+ if ((initial ne denot) || ctx.phaseId != firstPhaseId) {
+ ctx.withPhase(firstPhaseId).stillValidInOwner(initial) ||
+ // Workaround #1895: A symbol might not be entered into an owner
+ // until the second phase where it exists
+ (denot.validFor.containsPhaseId(firstPhaseId + 1)) &&
+ ctx.withPhase(firstPhaseId + 1).stillValidInOwner(initial)
+ } else
stillValidInOwner(denot)
}
diff --git a/compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala b/compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala
index 925ec08b2..64474cecd 100644
--- a/compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala
+++ b/compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala
@@ -63,8 +63,13 @@ class ExtensionMethods extends MiniPhaseTransform with DenotTransformer with Ful
// not generate them again.
if (!(valueClass is Scala2x)) ctx.atPhase(thisTransformer) { implicit ctx =>
for (decl <- valueClass.classInfo.decls) {
- if (isMethodWithExtension(decl))
- decls1.enter(createExtensionMethod(decl, moduleClassSym.symbol))
+ if (isMethodWithExtension(decl)) {
+ val meth = createExtensionMethod(decl, moduleClassSym.symbol)
+ decls1.enter(meth)
+ // Workaround #1895: force denotation of `meth` to be
+ // at phase where `meth` is entered into the decls of a class
+ meth.denot(ctx.withPhase(thisTransformer.next))
+ }
}
}
diff --git a/tests/repl/vc.check b/tests/repl/vc.check
new file mode 100644
index 000000000..e2c9b65fd
--- /dev/null
+++ b/tests/repl/vc.check
@@ -0,0 +1,5 @@
+scala> class Foo(x: Int) extends AnyVal { def hi: Int = 1 }
+defined class Foo
+scala> new Foo(1).hi
+val res0: Int = 1
+scala> :quit