summaryrefslogtreecommitdiff
path: root/src/compiler/scala/reflect/reify/codegen/GenTypes.scala
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2014-01-28 16:43:40 -0800
committerAdriaan Moors <adriaan.moors@typesafe.com>2014-02-19 10:12:19 -0800
commitc001b888b896989a2c0afa0c24d038502970151c (patch)
treeb04b54e08a8ad8f95db4e14d6509a044146ef1c5 /src/compiler/scala/reflect/reify/codegen/GenTypes.scala
parent3dbcb1b9d4daa5cba98747bbc66f898ba0f864fd (diff)
downloadscala-c001b888b896989a2c0afa0c24d038502970151c.tar.gz
scala-c001b888b896989a2c0afa0c24d038502970151c.tar.bz2
scala-c001b888b896989a2c0afa0c24d038502970151c.zip
SI-1503 don't assume unsound type for ident/literal patterns
The fix only kicks in under -Xfuture. We also warn under -Xlint. What type should a variable bound to the value matched by a pattern have? To avoid CCEs, it should be a type that's implied by the matching semantics of the pattern. Usually, the type implied by a pattern matching a certain value is the pattern's type, because pattern matching implies instance-of checks. However, Stable Identifier and Literal patterns are matched using `==`, which does not imply a type for the binder that binds the matched value. The change in type checking due to this fix is that programs that used to crash with a CCE (because we blindly cast to the type of the pattern, which a `==` check does not imply) now get a weaker type instead (and no cast). They may still type check, or they may not. To compensate for this fix, change `case x@Foo => x` to `case x: Foo.type => x`, if it's important that `x` have type `Foo.type`. See also: - SI-4577: matching of singleton type patterns uses `eq`, not `==` (so that the types are not a lie). - SI-5024: patmat strips unused bindings, but affects semantics
Diffstat (limited to 'src/compiler/scala/reflect/reify/codegen/GenTypes.scala')
-rw-r--r--src/compiler/scala/reflect/reify/codegen/GenTypes.scala4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/compiler/scala/reflect/reify/codegen/GenTypes.scala b/src/compiler/scala/reflect/reify/codegen/GenTypes.scala
index a90a3a338b..cfd3239015 100644
--- a/src/compiler/scala/reflect/reify/codegen/GenTypes.scala
+++ b/src/compiler/scala/reflect/reify/codegen/GenTypes.scala
@@ -34,9 +34,9 @@ trait GenTypes {
if (tsym.isClass && tpe == tsym.typeConstructor && tsym.isStatic)
Select(Select(reify(tsym), nme.asType), nme.toTypeConstructor)
else tpe match {
- case tpe @ NoType =>
+ case tpe : NoType.type =>
reifyMirrorObject(tpe)
- case tpe @ NoPrefix =>
+ case tpe : NoPrefix.type =>
reifyMirrorObject(tpe)
case tpe @ ThisType(root) if root.isRoot =>
mirrorBuildCall(nme.thisPrefix, mirrorMirrorSelect(nme.RootClass))