summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-10-09 11:16:40 +0200
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-10-09 11:16:40 +0200
commit22233f40f641815fe7b9304bb386ee27c8422603 (patch)
tree1f74d6849cb6fcde1c6fde5eecbd1f4fdfc67d26 /src
parent19d1c819033c0c739342225d48a3e1d153958c36 (diff)
parentff051e29eae9139a688664f3531028cd89df4c75 (diff)
downloadscala-22233f40f641815fe7b9304bb386ee27c8422603.tar.gz
scala-22233f40f641815fe7b9304bb386ee27c8422603.tar.bz2
scala-22233f40f641815fe7b9304bb386ee27c8422603.zip
Merge pull request #4038 from adriaanm/t8894v2.11.3
SI-8894 dealias when looking at tuple components
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala1
-rw-r--r--src/reflect/scala/reflect/internal/Definitions.scala3
2 files changed, 2 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala
index a8852a3ff3..21e90b1d78 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala
@@ -172,7 +172,6 @@ trait TreeAndTypeAnalysis extends Debugging {
// a type is "uncheckable" (for exhaustivity) if we don't statically know its subtypes (i.e., it's unsealed)
// we consider tuple types with at least one component of a checkable type as a checkable type
def uncheckableType(tp: Type): Boolean = {
- def tupleComponents(tp: Type) = tp.normalize.typeArgs
val checkable = (
(isTupleType(tp) && tupleComponents(tp).exists(tp => !uncheckableType(tp)))
|| enumerateSubtypes(tp).nonEmpty)
diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala
index 57a17693ad..70375d974c 100644
--- a/src/reflect/scala/reflect/internal/Definitions.scala
+++ b/src/reflect/scala/reflect/internal/Definitions.scala
@@ -653,6 +653,7 @@ trait Definitions extends api.StandardDefinitions {
// tends to change the course of events by forcing types.
def isFunctionType(tp: Type) = isFunctionTypeDirect(tp.dealiasWiden)
def isTupleType(tp: Type) = isTupleTypeDirect(tp.dealiasWiden)
+ def tupleComponents(tp: Type) = tp.dealiasWiden.typeArgs
lazy val ProductRootClass: ClassSymbol = requiredClass[scala.Product]
def Product_productArity = getMemberMethod(ProductRootClass, nme.productArity)
@@ -837,7 +838,7 @@ trait Definitions extends api.StandardDefinitions {
def typeOfMemberNamedApply(tp: Type) = typeArgOfBaseTypeOr(tp, SeqClass)(resultOfMatchingMethod(tp, nme.apply)(IntTpe))
def typeOfMemberNamedDrop(tp: Type) = typeArgOfBaseTypeOr(tp, SeqClass)(resultOfMatchingMethod(tp, nme.drop)(IntTpe))
def typesOfSelectors(tp: Type) =
- if (isTupleType(tp)) tp.typeArgs
+ if (isTupleType(tp)) tupleComponents(tp)
else getterMemberTypes(tp, productSelectors(tp))
// SI-8128 Still using the type argument of the base type at Seq/Option if this is an old-style (2.10 compatible)