@@ -412,58 +412,55 @@ trait Inferencing { this: Typer =>
412
412
// `qualifying`.
413
413
414
414
val ownedVars = state.ownedVars
415
- if (ownedVars.size > 0 ) {
416
- val qualifying = if (locked.isEmpty) ownedVars else ownedVars -- locked
417
- if (! qualifying.isEmpty) {
418
- typr.println(i " interpolate $tree: ${tree.tpe.widen} in $state, owned vars = ${state.ownedVars.toList}%, %, previous = ${locked.toList}%, % / ${state.constraint}" )
419
- val resultAlreadyConstrained =
420
- tree.isInstanceOf [Apply ] || tree.tpe.isInstanceOf [MethodOrPoly ]
421
- if (! resultAlreadyConstrained)
422
- constrainResult(tree.symbol, tree.tpe, pt)
423
- // This is needed because it could establish singleton type upper bounds. See i2998.scala.
424
-
425
- val tp = tree.tpe.widen
426
- val vs = variances(tp)
427
-
428
- // Avoid interpolating variables occurring in tree's type if typerstate has unreported errors.
429
- // Reason: The errors might reflect unsatisfiable constraints. In that
430
- // case interpolating without taking account the constraints risks producing
431
- // nonsensical types that then in turn produce incomprehensible errors.
432
- // An example is in neg/i1240.scala. Without the condition in the next code line
433
- // we get for
434
- //
435
- // val y: List[List[String]] = List(List(1))
436
- //
437
- // i1430.scala:5: error: type mismatch:
438
- // found : Int(1)
439
- // required: Nothing
440
- // val y: List[List[String]] = List(List(1))
441
- // ^
442
- // With the condition, we get the much more sensical:
443
- //
444
- // i1430.scala:5: error: type mismatch:
445
- // found : Int(1)
446
- // required: String
447
- // val y: List[List[String]] = List(List(1))
448
- val hasUnreportedErrors = state.reporter.hasUnreportedErrors
449
- def constraint = state.constraint
450
- for (tvar <- qualifying)
451
- if (! tvar.isInstantiated && state.constraint.contains(tvar)) {
452
- // Needs to be checked again, since previous interpolations could already have
453
- // instantiated `tvar` through unification.
454
- val v = vs(tvar)
455
- if (v == null ) {
456
- typr.println(i " interpolate non-occurring $tvar in $state in $tree: $tp, fromBelow = ${tvar.hasLowerBound}, $constraint" )
457
- tvar.instantiate(fromBelow = tvar.hasLowerBound)
458
- }
459
- else if (! hasUnreportedErrors)
460
- if (v.intValue != 0 ) {
461
- typr.println(i " interpolate $tvar in $state in $tree: $tp, fromBelow = ${v.intValue == 1 }, $constraint" )
462
- tvar.instantiate(fromBelow = v.intValue == 1 )
463
- }
464
- else typr.println(i " no interpolation for nonvariant $tvar in $state" )
415
+ if (ownedVars.size > 0 && (locked.size == 0 || ownedVars.exists(! locked.contains(_)))) {
416
+ typr.println(i " interpolate $tree: ${tree.tpe.widen} in $state, owned vars = ${state.ownedVars.toList}%, %, previous = ${locked.toList}%, % / ${state.constraint}" )
417
+ val resultAlreadyConstrained =
418
+ tree.isInstanceOf [Apply ] || tree.tpe.isInstanceOf [MethodOrPoly ]
419
+ if (! resultAlreadyConstrained)
420
+ constrainResult(tree.symbol, tree.tpe, pt)
421
+ // This is needed because it could establish singleton type upper bounds. See i2998.scala.
422
+
423
+ val tp = tree.tpe.widen
424
+ val vs = variances(tp)
425
+
426
+ // Avoid interpolating variables occurring in tree's type if typerstate has unreported errors.
427
+ // Reason: The errors might reflect unsatisfiable constraints. In that
428
+ // case interpolating without taking account the constraints risks producing
429
+ // nonsensical types that then in turn produce incomprehensible errors.
430
+ // An example is in neg/i1240.scala. Without the condition in the next code line
431
+ // we get for
432
+ //
433
+ // val y: List[List[String]] = List(List(1))
434
+ //
435
+ // i1430.scala:5: error: type mismatch:
436
+ // found : Int(1)
437
+ // required: Nothing
438
+ // val y: List[List[String]] = List(List(1))
439
+ // ^
440
+ // With the condition, we get the much more sensical:
441
+ //
442
+ // i1430.scala:5: error: type mismatch:
443
+ // found : Int(1)
444
+ // required: String
445
+ // val y: List[List[String]] = List(List(1))
446
+ val hasUnreportedErrors = state.reporter.hasUnreportedErrors
447
+ def constraint = state.constraint
448
+ for (tvar <- ownedVars)
449
+ if (! locked.contains(tvar) && ! tvar.isInstantiated && state.constraint.contains(tvar)) {
450
+ // Needs to be checked again, since previous interpolations could already have
451
+ // instantiated `tvar` through unification.
452
+ val v = vs(tvar)
453
+ if (v == null ) {
454
+ typr.println(i " interpolate non-occurring $tvar in $state in $tree: $tp, fromBelow = ${tvar.hasLowerBound}, $constraint" )
455
+ tvar.instantiate(fromBelow = tvar.hasLowerBound)
465
456
}
466
- }
457
+ else if (! hasUnreportedErrors)
458
+ if (v.intValue != 0 ) {
459
+ typr.println(i " interpolate $tvar in $state in $tree: $tp, fromBelow = ${v.intValue == 1 }, $constraint" )
460
+ tvar.instantiate(fromBelow = v.intValue == 1 )
461
+ }
462
+ else typr.println(i " no interpolation for nonvariant $tvar in $state" )
463
+ }
467
464
}
468
465
tree
469
466
}
0 commit comments