@@ -419,31 +419,32 @@ class TypeApplications(val self: Type) extends AnyVal {
419
419
* - interpolate, so that any (F-bounded) type parameters in the resulting bounds are avoided.
420
420
* The resulting bounds are joined (via &) with corresponding type bound arguments.
421
421
*/
422
- def normalizeWildcardArg (arg : Type , tparam : TypeParamInfo ): Type = arg match {
422
+ def normalizeWildcardArg (typParams : List [ TypeSymbol ])( arg : Type , tparam : TypeSymbol ): Type = arg match {
423
423
case TypeBounds (lo, hi) =>
424
- val v = tparam.paramVariance
425
- val avoidParams = new ApproximatingTypeMap {
424
+ def avoidParams (seen : Set [Symbol ], v : Int ): ApproximatingTypeMap = new ApproximatingTypeMap {
426
425
variance = if (v >= 0 ) 1 else - 1
427
426
def apply (t : Type ) = t match {
428
427
case t : TypeRef if typParams contains t.symbol =>
429
- val bounds = apply(t.info).bounds
430
- range(bounds.lo, bounds.hi)
428
+ val lo = atVariance(- variance)(apply(t.info.loBound))
429
+ val hi =
430
+ if (seen.contains(t.symbol)) t.topType
431
+ else avoidParams(seen + t.symbol, variance)(t.info.hiBound)
432
+ range(lo, hi)
431
433
case _ => mapOver(t)
432
434
}
433
435
}
436
+ val v = tparam.paramVariance
434
437
val pbounds = dealiased match {
435
438
case dealiased @ TypeRef (prefix, _) =>
436
439
val (concreteArgs, concreteParams) = // @!!! optimize?
437
- args.zip(typeParams.asInstanceOf [List [TypeSymbol ]])
438
- .filter(! _._1.isInstanceOf [TypeBounds ])
439
- .unzip
440
- avoidParams(
441
- tparam.paramInfo.asSeenFrom(prefix, tparam.asInstanceOf [TypeSymbol ].owner)
442
- .subst(concreteParams, concreteArgs)).orElse(TypeBounds .empty)
440
+ args.zip(typParams).filter(! _._1.isInstanceOf [TypeBounds ]).unzip
441
+ avoidParams(Set (tparam), v)(
442
+ tparam.paramInfo.asSeenFrom(prefix, tparam.owner)
443
+ .subst(concreteParams, concreteArgs))
443
444
case _ =>
444
445
TypeBounds .empty
445
446
}
446
- // typr.println(i"normalize arg $arg for $tparam in $self app $args%, %, pbounds, = $pbounds")
447
+ typr.println(i " normalize arg $arg for $tparam in $self app $args%, %, pbounds, = $pbounds" )
447
448
if (v > 0 ) hi & pbounds.hiBound
448
449
else if (v < 0 ) lo | pbounds.loBound
449
450
else arg & pbounds
@@ -500,9 +501,10 @@ class TypeApplications(val self: Type) extends AnyVal {
500
501
case _ if typParams.isEmpty || typParams.head.isInstanceOf [LambdaParam ] =>
501
502
HKApply (self, args)
502
503
case dealiased =>
503
- if (Config .newScheme)
504
- AppliedType (self, args.zipWithConserve(typParams)(normalizeWildcardArg))
505
- else
504
+ if (Config .newScheme) {
505
+ val tparamSyms = typParams.asInstanceOf [List [TypeSymbol ]]
506
+ AppliedType (self, args.zipWithConserve(tparamSyms)(normalizeWildcardArg(tparamSyms)))
507
+ } else
506
508
matchParams(dealiased, typParams, args)
507
509
}
508
510
}
0 commit comments