diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2014-01-28 16:43:40 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2014-02-19 10:12:19 -0800 |
commit | c001b888b896989a2c0afa0c24d038502970151c (patch) | |
tree | b04b54e08a8ad8f95db4e14d6509a044146ef1c5 /test/files/neg/t1503.scala | |
parent | 3dbcb1b9d4daa5cba98747bbc66f898ba0f864fd (diff) | |
download | scala-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 'test/files/neg/t1503.scala')
-rw-r--r-- | test/files/neg/t1503.scala | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/test/files/neg/t1503.scala b/test/files/neg/t1503.scala new file mode 100644 index 0000000000..9877f99d0a --- /dev/null +++ b/test/files/neg/t1503.scala @@ -0,0 +1,8 @@ +object Whatever { + override def equals(x: Any) = true +} + +class Test { + // when left to its own devices, and not under -Xfuture, the return type is Whatever.type + def matchWhateverCCE(x: Any) = x match { case n @ Whatever => n } +}
\ No newline at end of file |