From a45a3e5f573fc5b768fcd0d6be507a0af8fd53cc Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Thu, 13 Oct 2016 16:51:05 +0200 Subject: Fix #1590: Eliminate wildcards when approximating a type Fixes #1590. Type variables should never be instantiated to types containing wildcards. --- src/dotty/tools/dotc/core/ConstraintHandling.scala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/dotty/tools/dotc/core/ConstraintHandling.scala b/src/dotty/tools/dotc/core/ConstraintHandling.scala index 3835d553c..95fa40704 100644 --- a/src/dotty/tools/dotc/core/ConstraintHandling.scala +++ b/src/dotty/tools/dotc/core/ConstraintHandling.scala @@ -162,7 +162,8 @@ trait ConstraintHandling { /** Solve constraint set for given type parameter `param`. * If `fromBelow` is true the parameter is approximated by its lower bound, * otherwise it is approximated by its upper bound. However, any occurrences - * of the parameter in a refinement somewhere in the bound are removed. + * of the parameter in a refinement somewhere in the bound are removed. Also + * wildcard types in bounds are approximated by their upper or lower bounds. * (Such occurrences can arise for F-bounded types). * The constraint is left unchanged. * @return the instantiating type @@ -174,6 +175,9 @@ trait ConstraintHandling { def apply(tp: Type) = mapOver { tp match { case tp: RefinedType if param occursIn tp.refinedInfo => tp.parent + case tp: WildcardType => + val bounds = tp.optBounds.orElse(TypeBounds.empty).bounds + if (fromBelow == (variance >= 0)) bounds.lo else bounds.hi case _ => tp } } -- cgit v1.2.3