diff options
author | Martin Odersky <odersky@gmail.com> | 2015-03-02 14:33:45 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:14:13 +0100 |
commit | 2b4236e755ae3a7182dbffa3e633666bf1b32c8a (patch) | |
tree | 4fba80e001fc1bfebfce348ab4209dc4bcf28df1 /src/dotty/tools/dotc/typer/TypeAssigner.scala | |
parent | 7bd12db9dfad6b5fd28c87e369fa093158840bf7 (diff) | |
download | dotty-2b4236e755ae3a7182dbffa3e633666bf1b32c8a.tar.gz dotty-2b4236e755ae3a7182dbffa3e633666bf1b32c8a.tar.bz2 dotty-2b4236e755ae3a7182dbffa3e633666bf1b32c8a.zip |
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.
Diffstat (limited to 'src/dotty/tools/dotc/typer/TypeAssigner.scala')
-rw-r--r-- | src/dotty/tools/dotc/typer/TypeAssigner.scala | 8 |
1 files changed, 6 insertions, 2 deletions
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 } |