diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-04-23 23:55:05 +0200 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-04-24 10:09:25 +0200 |
commit | 62713964b96f64f9c0fd0070c89aa6571679856d (patch) | |
tree | 36141e60bec629274a7b716386672f8e3d897509 /test/files/neg/t7369.flags | |
parent | d484c17dbc47559dad8a7ae544d14a285cdfb8b2 (diff) | |
download | scala-62713964b96f64f9c0fd0070c89aa6571679856d.tar.gz scala-62713964b96f64f9c0fd0070c89aa6571679856d.tar.bz2 scala-62713964b96f64f9c0fd0070c89aa6571679856d.zip |
SI-7369 Avoid spurious unreachable warnings in patterns
Unreachability analysis draws on the enumerated domain of types
(e.g sealed subclasses + null, or true/false), and also looks at all
stable identifier patterns tested for equality against the same 'slot'
in a pattern.
It was drawing the wrong conclusions about stable identifier patterns.
Unlike the domain constants, two such values may hold the same value,
so we can't assume that matching X precludes matching Y in the same
slot in a subsequent case.
For example:
val X: Boolean = true; val Y: Boolean = true
def m1(t1: Tuple1[Boolean]) = t1 match {
case Tuple1(true) =>
case Tuple1(false) =>
case Tuple1(false) => // correctly unreachable
}
def m2(t1: Tuple1[Boolean]) = t1 match {
case Tuple1(X) =>
case Tuple1(Y) => // spurious unreachable warning
}
//
// Before
//
reachability, vars:
V2: Boolean ::= true | false// Set(false, Y, X, true) // = x1._1
V1: (Boolean,) ::= null | ... // = x1
equality axioms:
V2=true#4 \/ V2=false#5 /\
-V2=false#5 \/ -V2=Y#3 /\
-V2=false#5 \/ -V2=X#2 /\
-V2=false#5 \/ -V2=true#4 /\
-V2=Y#3 \/ -V2=X#2 /\
-V2=Y#3 \/ -V2=true#4 /\
-V2=X#2 \/ -V2=true#4
//
// After
//
reachability, vars:
V2: Boolean ::= true | false// Set(false, Y, X, true) // = x1._1
V1: (Boolean,) ::= null | ... // = x1
equality axioms:
V2=true#4 \/ V2=false#5 /\
-V2=false#5 \/ -V2=true#4
Diffstat (limited to 'test/files/neg/t7369.flags')
-rw-r--r-- | test/files/neg/t7369.flags | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/test/files/neg/t7369.flags b/test/files/neg/t7369.flags new file mode 100644 index 0000000000..e8fb65d50c --- /dev/null +++ b/test/files/neg/t7369.flags @@ -0,0 +1 @@ +-Xfatal-warnings
\ No newline at end of file |