From a546fc8f4979a0705e62df71b905860e1ce0a89d Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Tue, 21 Jun 2011 17:21:07 +0000 Subject: Relaxes a typer check which fails valid code wi... Relaxes a typer check which fails valid code with NoCommonType. If the instantiated types or type bounds do not conform, it tries normalizing the type before throwing the exception. Closes #4553. I wrote this patch with adriaan already, but bonus review by moors. --- src/compiler/scala/reflect/internal/Types.scala | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/scala/reflect/internal/Types.scala b/src/compiler/scala/reflect/internal/Types.scala index ed5dd1bc72..e8b9dc0865 100644 --- a/src/compiler/scala/reflect/internal/Types.scala +++ b/src/compiler/scala/reflect/internal/Types.scala @@ -5574,26 +5574,32 @@ A type's typeSymbol should never be inspected directly. * Returns list of list of bounds infos, where corresponding type * parameters are renamed to tparams. */ - private def matchingBounds(tps: List[Type], tparams: List[Symbol]): List[List[Type]] = - tps map { + private def matchingBounds(tps: List[Type], tparams: List[Symbol]): List[List[Type]] = { + def getBounds(tp: Type): List[Type] = tp match { case PolyType(tparams1, _) if sameLength(tparams1, tparams) => tparams1 map (tparam => tparam.info.substSym(tparams1, tparams)) - case _ => - throw new NoCommonType(tps) + case tp => + if (tp ne tp.normalize) getBounds(tp.normalize) + else throw new NoCommonType(tps) } + tps map getBounds + } /** All types in list must be polytypes with type parameter lists of * same length as tparams. * Returns list of instance types, where corresponding type * parameters are renamed to tparams. */ - private def matchingInstTypes(tps: List[Type], tparams: List[Symbol]): List[Type] = - tps map { + private def matchingInstTypes(tps: List[Type], tparams: List[Symbol]): List[Type] = { + def transformResultType(tp: Type): Type = tp match { case PolyType(tparams1, restpe) if sameLength(tparams1, tparams) => restpe.substSym(tparams1, tparams) - case _ => - throw new NoCommonType(tps) + case tp => + if (tp ne tp.normalize) transformResultType(tp.normalize) + else throw new NoCommonType(tps) } + tps map transformResultType + } /** All types in list must be method types with equal parameter types. * Returns list of their result types. -- cgit v1.2.3