From 2b4236e755ae3a7182dbffa3e633666bf1b32c8a Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Mon, 2 Mar 2015 14:33:45 +0100 Subject: Fix problems in avoid It turned out that avoid does not always produce a supertype of the original type, which makes the additions in "ensureNoLocalRefs" type incorrect. This commit fixes the problems. --- src/dotty/tools/dotc/typer/TypeAssigner.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/dotty/tools/dotc/typer/TypeAssigner.scala') diff --git a/src/dotty/tools/dotc/typer/TypeAssigner.scala b/src/dotty/tools/dotc/typer/TypeAssigner.scala index ea489f7b0..84198b954 100644 --- a/src/dotty/tools/dotc/typer/TypeAssigner.scala +++ b/src/dotty/tools/dotc/typer/TypeAssigner.scala @@ -47,6 +47,8 @@ trait TypeAssigner { sym.owner.isTerm && (forbidden contains sym) || !(sym.owner is Package) && toAvoid(tp.prefix) ) + case tp: TypeRef => + forbidden contains tp.symbol case _ => false } @@ -57,7 +59,7 @@ trait TypeAssigner { tp.info match { case TypeAlias(ref) => apply(ref) - case info: ClassInfo => + case info: ClassInfo if variance > 0 => val parentType = info.instantiatedParents.reduceLeft(ctx.typeComparer.andType(_, _)) def addRefinement(parent: Type, decl: Symbol) = { val inherited = parentType.findMember(decl.name, info.cls.thisType, Private) @@ -73,12 +75,14 @@ trait TypeAssigner { sym => sym.is(TypeParamAccessor | Private) || sym.isConstructor) val fullType = (parentType /: refinableDecls)(addRefinement) mapOver(fullType) + case TypeBounds(lo, hi) if variance > 0 => + apply(hi) case _ => mapOver(tp) } case tp: RefinedType => val tp1 @ RefinedType(parent1, _) = mapOver(tp) - if (tp1.refinedInfo existsPart toAvoid) { + if (tp1.refinedInfo.existsPart(toAvoid) && variance > 0) { typr.println(s"dropping refinement from $tp1") parent1 } -- cgit v1.2.3