From eadc357538502b4ecf77e465af73b5b9c602d980 Mon Sep 17 00:00:00 2001 From: Georgi Krastev Date: Tue, 5 Jan 2021 20:50:39 +0200 Subject: [PATCH] Preserve kind of relativeInfo --- src/reflect/scala/reflect/internal/Types.scala | 2 +- .../scala/reflect/internal/tpe/TypeMaps.scala | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala index dc10202117c4..1cf542d9979b 100644 --- a/src/reflect/scala/reflect/internal/Types.scala +++ b/src/reflect/scala/reflect/internal/Types.scala @@ -2438,7 +2438,7 @@ trait Types // interpret symbol's info in terms of the type's prefix and type args - protected def relativeInfo: Type = appliedType(sym.info.asSeenFrom(pre, sym.owner), argsOrDummies) + protected def relativeInfo: Type = appliedType(sym.info.asSeenFrom(pre, sym.owner), args) // @M: propagate actual type params (args) to `tp`, by replacing // formal type parameters with actual ones. If tp is higher kinded, diff --git a/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala b/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala index a501b78b92a7..5604e7d88e86 100644 --- a/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala +++ b/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala @@ -345,17 +345,18 @@ private[internal] trait TypeMaps { val tp1 = mapOver(tp) if (variance.isInvariant) tp1 else tp1 match { - case TypeRef(_, sym, typeArgs) if tparams.contains(sym) && occurCount(sym) == 1 => + case TypeRef(pre, sym, args) if tparams.contains(sym) && occurCount(sym) == 1 => + val repl = if (variance.isPositive) dropSingletonType(tp1.upperBound) else tp1.lowerBound def msg = { val word = if (variance.isPositive) "upper" else "lower" s"Widened lone occurrence of $tp1 inside existential to $word bound" } - - val widened = if (variance.isPositive) dropSingletonType(tp1.upperBound) else tp1.lowerBound - if (widened.typeSymbol.isBottomClass || anyContains.collect(widened)) tp1 - else debuglogResult(msg)(appliedType(genPolyType(sym.typeParams, widened), typeArgs)) - case other => - other + if (!repl.typeSymbol.isBottomClass && ! anyContains.collect(repl)) + debuglogResult(msg)(repl) + else + tp1 + case _ => + tp1 } } override def mapOver(tp: Type): Type = tp match {