diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-08-08 13:40:38 +0200 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-08-08 13:44:40 +0200 |
commit | 52fa311f885e20b05178bf28553f3952ba8a5df7 (patch) | |
tree | 64f8e534a50e3816dcb00d641d431dc3bc984f78 /src/compiler/scala/tools/nsc/typechecker/Typers.scala | |
parent | a80b538763d88604d93b8c71604042c69e6b1073 (diff) | |
download | scala-52fa311f885e20b05178bf28553f3952ba8a5df7.tar.gz scala-52fa311f885e20b05178bf28553f3952ba8a5df7.tar.bz2 scala-52fa311f885e20b05178bf28553f3952ba8a5df7.zip |
SI-6205 make pt fully defined before inferTypedPattern
refines my fix for SI-2038 (#981) by making pt fully defined before calling inferTypedPattern,
instead of making the result of inferTypedPattern fully defined
I finally realized my mistake by diffing the -Ytyper-debug output of compiling the variants with:
```
x match {case Holder(k: A[kt]) => (k: A[kt])}
```
and
```
(x: Any) match {case Holder(k: A[kt]) => (k: A[kt])}
```
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index a6d7424837..be54890189 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -5040,10 +5040,11 @@ trait Typers extends Modes with Adaptations with Tags { if (isPatternMode) { val uncheckedTypeExtractor = extractorForUncheckedType(tpt.pos, tptTyped.tpe) - val ownType = inferTypedPattern(tptTyped, tptTyped.tpe, pt, canRemedy = uncheckedTypeExtractor.nonEmpty) - // println(s"Typed($expr, ${tpt.tpe}) : $pt --> $ownType (${isFullyDefined(ownType)}, ${makeFullyDefined(ownType)})") + // make fully defined to avoid bounded wildcard types that may be in pt from calling dropExistential (SI-2038) - treeTyped setType (if (isFullyDefined(ownType)) ownType else makeFullyDefined(ownType)) //ownType + val ptDefined = if (isFullyDefined(pt)) pt else makeFullyDefined(pt) + val ownType = inferTypedPattern(tptTyped, tptTyped.tpe, ptDefined, canRemedy = uncheckedTypeExtractor.nonEmpty) + treeTyped setType ownType uncheckedTypeExtractor match { case None => treeTyped |