aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2016-12-10 14:46:04 +0100
committerGitHub <noreply@github.com>2016-12-10 14:46:04 +0100
commit4daf543cf6857295807a8a9d37890891274255a9 (patch)
treed2ad97d9af40edfdf17ec9c00910094c206610c9 /compiler
parent48309018fc2ab8d38c46408326f739e5652412c7 (diff)
parenta7003bb223fb535f64a3026ff2a5a3e7d3ab7609 (diff)
downloaddotty-4daf543cf6857295807a8a9d37890891274255a9.tar.gz
dotty-4daf543cf6857295807a8a9d37890891274255a9.tar.bz2
dotty-4daf543cf6857295807a8a9d37890891274255a9.zip
Merge pull request #1768 from dotty-staging/fix-#1765
Fix #1765: Context bounds and denotation handling
Diffstat (limited to 'compiler')
-rw-r--r--compiler/src/dotty/tools/dotc/ast/Desugar.scala15
-rw-r--r--compiler/src/dotty/tools/dotc/core/Denotations.scala22
-rw-r--r--compiler/src/dotty/tools/dotc/core/Periods.scala2
-rw-r--r--compiler/src/dotty/tools/dotc/transform/Memoize.scala8
4 files changed, 35 insertions, 12 deletions
diff --git a/compiler/src/dotty/tools/dotc/ast/Desugar.scala b/compiler/src/dotty/tools/dotc/ast/Desugar.scala
index 7f25d6b0c..15cb0b665 100644
--- a/compiler/src/dotty/tools/dotc/ast/Desugar.scala
+++ b/compiler/src/dotty/tools/dotc/ast/Desugar.scala
@@ -142,16 +142,21 @@ object desugar {
val DefDef(name, tparams, vparamss, tpt, rhs) = meth
val mods = meth.mods
val epbuf = new ListBuffer[ValDef]
- val tparams1 = tparams mapConserve {
- case tparam @ TypeDef(_, ContextBounds(tbounds, cxbounds)) =>
+ def desugarContextBounds(rhs: Tree): Tree = rhs match {
+ case ContextBounds(tbounds, cxbounds) =>
for (cxbound <- cxbounds) {
val paramFlags: FlagSet = if (isPrimaryConstructor) PrivateLocalParamAccessor else Param
val epname = ctx.freshName(nme.EVIDENCE_PARAM_PREFIX).toTermName
epbuf += ValDef(epname, cxbound, EmptyTree).withFlags(paramFlags | Implicit)
}
- cpy.TypeDef(tparam)(rhs = tbounds)
- case tparam =>
- tparam
+ tbounds
+ case PolyTypeTree(tparams, body) =>
+ cpy.PolyTypeTree(rhs)(tparams, desugarContextBounds(body))
+ case _ =>
+ rhs
+ }
+ val tparams1 = tparams mapConserve { tdef =>
+ cpy.TypeDef(tdef)(rhs = desugarContextBounds(tdef.rhs))
}
val meth1 = addEvidenceParams(cpy.DefDef(meth)(tparams = tparams1), epbuf.toList)
diff --git a/compiler/src/dotty/tools/dotc/core/Denotations.scala b/compiler/src/dotty/tools/dotc/core/Denotations.scala
index 6a39c5787..99c688d50 100644
--- a/compiler/src/dotty/tools/dotc/core/Denotations.scala
+++ b/compiler/src/dotty/tools/dotc/core/Denotations.scala
@@ -132,7 +132,7 @@ object Denotations {
def atSignature(sig: Signature, site: Type = NoPrefix, relaxed: Boolean = false)(implicit ctx: Context): Denotation
/** The variant of this denotation that's current in the given context.
- * If no such denotation exists, returns the denotation with each alternative
+ * If no such denotation exists, returns the denotation with each alternative
* at its first point of definition.
*/
def current(implicit ctx: Context): Denotation
@@ -744,6 +744,20 @@ object Denotations {
else NoDenotation
}
+ /** The next defined denotation (following `nextInRun`) or an arbitrary
+ * undefined denotation, if all denotations in a `nextinRun` cycle are
+ * undefined.
+ */
+ private def nextDefined: SingleDenotation = {
+ var p1 = this
+ var p2 = nextInRun
+ while (p1.validFor == Nowhere && (p1 ne p2)) {
+ p1 = p1.nextInRun
+ p2 = p2.nextInRun.nextInRun
+ }
+ p1
+ }
+
/** Produce a denotation that is valid for the given context.
* Usually called when !(validFor contains ctx.period)
* (even though this is not a precondition).
@@ -763,8 +777,9 @@ object Denotations {
// can happen if we sit on a stale denotation which has been replaced
// wholesale by an installAfter; in this case, proceed to the next
// denotation and try again.
- if (validFor == Nowhere && nextInRun.validFor != Nowhere) return nextInRun.current
- assert(false)
+ val nxt = nextDefined
+ if (nxt.validFor != Nowhere) return nxt
+ assert(false, this)
}
if (valid.runId != currentPeriod.runId)
@@ -905,6 +920,7 @@ object Denotations {
prev.nextInRun = this
this.nextInRun = old.nextInRun
old.validFor = Nowhere
+ old.nextInRun = this
}
def staleSymbolError(implicit ctx: Context) = {
diff --git a/compiler/src/dotty/tools/dotc/core/Periods.scala b/compiler/src/dotty/tools/dotc/core/Periods.scala
index 6efadab7f..29d9d208f 100644
--- a/compiler/src/dotty/tools/dotc/core/Periods.scala
+++ b/compiler/src/dotty/tools/dotc/core/Periods.scala
@@ -153,7 +153,7 @@ object Periods {
final val FirstPhaseId = 1
/** The number of bits needed to encode a phase identifier. */
- final val PhaseWidth = 6
+ final val PhaseWidth = 7
final val PhaseMask = (1 << PhaseWidth) - 1
final val MaxPossiblePhaseId = PhaseMask
}
diff --git a/compiler/src/dotty/tools/dotc/transform/Memoize.scala b/compiler/src/dotty/tools/dotc/transform/Memoize.scala
index 01c240e3a..0314d4ec4 100644
--- a/compiler/src/dotty/tools/dotc/transform/Memoize.scala
+++ b/compiler/src/dotty/tools/dotc/transform/Memoize.scala
@@ -47,7 +47,9 @@ import Decorators._
}
tree match {
case ddef: DefDef
- if !ddef.symbol.is(Deferred) && ddef.rhs == EmptyTree =>
+ if !ddef.symbol.is(Deferred) &&
+ !ddef.symbol.isConstructor && // constructors bodies are added later at phase Constructors
+ ddef.rhs == EmptyTree =>
errorLackImplementation(ddef)
case tdef: TypeDef
if tdef.symbol.isClass && !tdef.symbol.is(Deferred) && tdef.rhs == EmptyTree =>
@@ -89,10 +91,10 @@ import Decorators._
}
lazy val field = sym.field.orElse(newField).asTerm
-
+
def adaptToField(tree: Tree) =
if (tree.isEmpty) tree else tree.ensureConforms(field.info.widen)
-
+
if (sym.is(Accessor, butNot = NoFieldNeeded))
if (sym.isGetter) {
def skipBlocks(t: Tree): Tree = t match {