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 +++++- tests/pos/i1590.scala | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 tests/pos/i1590.scala 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 } } diff --git a/tests/pos/i1590.scala b/tests/pos/i1590.scala new file mode 100644 index 000000000..a8f36de45 --- /dev/null +++ b/tests/pos/i1590.scala @@ -0,0 +1 @@ +case class W[T](seq: Option[Option[T]] = Option.empty) -- cgit v1.2.3