diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 20 | ||||
-rw-r--r-- | test/files/pos/t3792.scala | 4 |
2 files changed, 15 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index cced26a780..a82f292ed2 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -4297,16 +4297,18 @@ A type's typeSymbol should never be inspected directly. case _: SingletonType => tp2 match { case _: SingletonType => - var origin1 = tp1 - while (origin1.underlying.isInstanceOf[SingletonType]) { - assert(origin1 ne origin1.underlying, origin1) - origin1 = origin1.underlying - } - var origin2 = tp2 - while (origin2.underlying.isInstanceOf[SingletonType]) { - assert(origin2 ne origin2.underlying, origin2) - origin2 = origin2.underlying + @inline def chaseDealiasedUnderlying(tp: Type): Type = { + var origin = tp + var next = origin.underlying.dealias + while (next.isInstanceOf[SingletonType]) { + assert(origin ne next, origin) + origin = next + next = origin.underlying.dealias + } + origin } + val origin1 = chaseDealiasedUnderlying(tp1) + val origin2 = chaseDealiasedUnderlying(tp2) ((origin1 ne tp1) || (origin2 ne tp2)) && (origin1 =:= origin2) case _ => false diff --git a/test/files/pos/t3792.scala b/test/files/pos/t3792.scala new file mode 100644 index 0000000000..10773c5f5b --- /dev/null +++ b/test/files/pos/t3792.scala @@ -0,0 +1,4 @@ +object Test { + type Hui = Nil.type + val n: Hui = Nil +}
\ No newline at end of file |