diff options
author | Martin Odersky <odersky@gmail.com> | 2014-11-24 18:49:20 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-11-24 19:01:22 +0100 |
commit | 48f78cd66df9f6cd31201ba79b02891a99f1dfbe (patch) | |
tree | 41b9dde3dc7937140548deba81acc213fc33bf30 /src/dotty/tools/dotc/core/Types.scala | |
parent | 642c5e4500abfc5cef51eee7ed0a98930a24312f (diff) | |
download | dotty-48f78cd66df9f6cd31201ba79b02891a99f1dfbe.tar.gz dotty-48f78cd66df9f6cd31201ba79b02891a99f1dfbe.tar.bz2 dotty-48f78cd66df9f6cd31201ba79b02891a99f1dfbe.zip |
Simpler cycle detection
Turns out that the last commit was a red herring. None of the hoops
it jumped though was necessary. Instead there was a bug in isRef
which caused `&` to erroneously compute T & Int as Int.
The bug was that we always approximated alias types by their high bound. But
in the present case, this leads to errors because U gets 'bounds >: Nothing <: Any',
but it was still an alias type (i.e. its Deferred flag is not set). The fix
dereferences aliases only if their info is a TypeAlias.
Diffstat (limited to 'src/dotty/tools/dotc/core/Types.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/Types.scala | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala index 33d108540..feee05d86 100644 --- a/src/dotty/tools/dotc/core/Types.scala +++ b/src/dotty/tools/dotc/core/Types.scala @@ -104,9 +104,10 @@ object Types { */ def isRef(sym: Symbol)(implicit ctx: Context): Boolean = stripTypeVar match { case this1: TypeRef => - val thissym = this1.symbol - if (thissym.isAliasType) this1.info.bounds.hi.isRef(sym) - else thissym eq sym + this1.info match { // see comment in Namers/typeDefSig + case TypeBounds(lo, hi) if lo eq hi => hi.isRef(sym) + case _ => this1.symbol eq sym + } case this1: RefinedType => // make sure all refinements are type arguments this1.parent.isRef(sym) && this.argInfos.nonEmpty |