From e2a130a32e8ec67bfc834f93ed44490bc9a83399 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 23 Sep 2014 14:05:14 +0200 Subject: Made TypeVars uncahable keys TypeVars can appear as keys in baseType caches. The problem is that their base types depend on their instantiation, which is not always know yet when the test is performed. So results of baseType on type variables should never be cached. Todo: check whether there are any other caching problems involving typevars. Conflicts: src/dotty/tools/dotc/core/SymDenotations.scala --- src/dotty/tools/dotc/core/SymDenotations.scala | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala index 88f75fbfd..a2637f8f8 100644 --- a/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/src/dotty/tools/dotc/core/SymDenotations.scala @@ -1323,6 +1323,9 @@ object SymDenotations { case _ => baseTypeRefOf(tp.underlying) } + case tp: TypeVar => + if (tp.inst.exists) computeBaseTypeRefOf(tp.inst) + else Uncachable(computeBaseTypeRefOf(tp.underlying)) case tp: TypeProxy => baseTypeRefOf(tp.underlying) case AndType(tp1, tp2) => @@ -1343,8 +1346,14 @@ object SymDenotations { var basetp = baseTypeRefCache get tp if (basetp == null) { baseTypeRefCache.put(tp, NoPrefix) - basetp = computeBaseTypeRefOf(tp) + basetp = computeBaseTypeRefOf(tp) match { + case Uncachable(basetp) => + baseTypeRefCache.remove(tp) + basetp + case basetp => baseTypeRefCache.put(tp, basetp) + basetp + } } else if (basetp == NoPrefix) { throw CyclicReference(this) } @@ -1422,6 +1431,8 @@ object SymDenotations { } } + private case class Uncachable(tp: Type) extends UncachedGroundType + /** The denotation of a package class. * It overrides ClassDenotation to take account of package objects when looking for members */ -- cgit v1.2.3