aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/TypeComparer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-12-13 13:21:54 +0100
committerMartin Odersky <odersky@gmail.com>2015-12-13 15:14:23 +0100
commitb350d209a20ebdf583d1dd2d3fdcd3be5073d2ef (patch)
tree6a607e7eb4a375d3b01b2700e267848a6cef13bf /src/dotty/tools/dotc/core/TypeComparer.scala
parent88f24efb2858f46c146214bc7e51f5de17c31bc0 (diff)
downloaddotty-b350d209a20ebdf583d1dd2d3fdcd3be5073d2ef.tar.gz
dotty-b350d209a20ebdf583d1dd2d3fdcd3be5073d2ef.tar.bz2
dotty-b350d209a20ebdf583d1dd2d3fdcd3be5073d2ef.zip
Perform variance adaptation only when needed in isSubType
Previously adaptIfHK was performed on every type application. This made t3152 fail. We now do this only on demand, in isSubType. t3152 now passes again. But the change unmasked another error, which makes Iter2 fail to compile.
Diffstat (limited to 'src/dotty/tools/dotc/core/TypeComparer.scala')
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala
index bf82bfe09..14b5a403c 100644
--- a/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -703,11 +703,19 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
* Further, no refinement refers back to the refined type via a refined this.
* The precondition is established by `skipMatching`.
*/
- private def isSubRefinements(tp1: RefinedType, tp2: RefinedType, limit: Type): Boolean =
- isSubType(tp1.refinedInfo, tp2.refinedInfo) && (
+ private def isSubRefinements(tp1: RefinedType, tp2: RefinedType, limit: Type): Boolean = {
+ def hasSubRefinement(tp1: RefinedType, refine2: Type): Boolean = {
+ isSubType(tp1.refinedInfo, refine2) || {
+ // last effort: try to adapt variances of higher-kinded types if this is sound.
+ val adapted2 = refine2.adaptHkVariances(tp1.parent.member(tp1.refinedName).symbol.info)
+ adapted2.ne(refine2) && hasSubRefinement(tp1, adapted2)
+ }
+ }
+ hasSubRefinement(tp1, tp2.refinedInfo) && (
(tp2.parent eq limit) ||
isSubRefinements(
tp1.parent.asInstanceOf[RefinedType], tp2.parent.asInstanceOf[RefinedType], limit))
+ }
/** A type has been covered previously in subtype checking if it
* is some combination of TypeRefs that point to classes, where the