Add CFG test for anonymous variables and fall-throughs with pattern cases

This commit is contained in:
Chris Smowton
2024-03-22 16:31:15 +00:00
parent cc8dcf63b0
commit 6cf956d07a
3 changed files with 100 additions and 24 deletions

View File

@@ -98,6 +98,24 @@ public class Test {
break;
}
switch(thing) {
case B(_, _):
case Integer _, String _, A(_, _) when thing.toString().equals("abc"):
case Float _:
break;
default:
break;
}
var result = switch(thing) {
case B(_, _):
case Integer _, String _, A(_, _) when thing.toString().equals("abc"):
case Float _:
yield 1;
default:
yield 2;
};
}
}

View File

@@ -1 +1 @@
//semmle-extractor-options: --javac-args --release 21
//semmle-extractor-options: --javac-args --release 22

View File

@@ -48,7 +48,7 @@
| Exhaustive.java:26:19:26:21 | { ... } | Exhaustive.java:8:22:8:25 | test |
| Test.java:1:14:1:17 | super(...) | Test.java:1:14:1:17 | Test |
| Test.java:1:14:1:17 | { ... } | Test.java:1:14:1:17 | super(...) |
| Test.java:3:41:101:3 | { ... } | Test.java:5:6:5:19 | switch (...) |
| Test.java:3:41:119:3 | { ... } | Test.java:5:6:5:19 | switch (...) |
| Test.java:5:6:5:19 | switch (...) | Test.java:5:14:5:18 | thing |
| Test.java:5:14:5:18 | thing | Test.java:6:8:6:23 | case <Pattern> |
| Test.java:6:8:6:23 | case <Pattern> | Test.java:6:20:6:20 | s |
@@ -288,26 +288,84 @@
| Test.java:95:21:95:21 | x | Test.java:95:28:95:28 | y |
| Test.java:95:28:95:28 | y | Test.java:95:15:95:29 | B(...) |
| Test.java:95:36:95:36 | z | Test.java:95:13:95:37 | A(...) |
| Test.java:96:10:96:15 | break | Test.java:3:22:3:25 | test |
| Test.java:96:10:96:15 | break | Test.java:101:6:101:18 | switch (...) |
| Test.java:97:8:97:15 | default | Test.java:98:10:98:15 | break |
| Test.java:98:10:98:15 | break | Test.java:3:22:3:25 | test |
| Test.java:105:8:105:8 | ...=... | Test.java:105:8:105:8 | <Expr>; |
| Test.java:105:8:105:8 | ...=... | Test.java:105:8:105:8 | A |
| Test.java:105:8:105:8 | <Expr>; | Test.java:105:8:105:8 | this |
| Test.java:105:8:105:8 | <Expr>; | Test.java:105:8:105:8 | this |
| Test.java:105:8:105:8 | b | Test.java:105:8:105:8 | ...=... |
| Test.java:105:8:105:8 | field3 | Test.java:105:8:105:8 | ...=... |
| Test.java:105:8:105:8 | super(...) | Test.java:105:8:105:8 | <Expr>; |
| Test.java:105:8:105:8 | this | Test.java:105:8:105:8 | b |
| Test.java:105:8:105:8 | this | Test.java:105:8:105:8 | field3 |
| Test.java:105:8:105:8 | { ... } | Test.java:105:8:105:8 | super(...) |
| Test.java:106:8:106:8 | ...=... | Test.java:106:8:106:8 | <Expr>; |
| Test.java:106:8:106:8 | ...=... | Test.java:106:8:106:8 | B |
| Test.java:106:8:106:8 | <Expr>; | Test.java:106:8:106:8 | this |
| Test.java:106:8:106:8 | <Expr>; | Test.java:106:8:106:8 | this |
| Test.java:106:8:106:8 | field1 | Test.java:106:8:106:8 | ...=... |
| Test.java:106:8:106:8 | field2 | Test.java:106:8:106:8 | ...=... |
| Test.java:106:8:106:8 | super(...) | Test.java:106:8:106:8 | <Expr>; |
| Test.java:106:8:106:8 | this | Test.java:106:8:106:8 | field1 |
| Test.java:106:8:106:8 | this | Test.java:106:8:106:8 | field2 |
| Test.java:106:8:106:8 | { ... } | Test.java:106:8:106:8 | super(...) |
| Test.java:98:10:98:15 | break | Test.java:101:6:101:18 | switch (...) |
| Test.java:101:6:101:18 | switch (...) | Test.java:101:13:101:17 | thing |
| Test.java:101:13:101:17 | thing | Test.java:102:8:102:20 | case <Pattern> |
| Test.java:102:8:102:20 | case <Pattern> | Test.java:102:15:102:15 | <anonymous local variable> |
| Test.java:102:8:102:20 | case <Pattern> | Test.java:103:8:103:77 | case <Pattern> |
| Test.java:102:13:102:19 | B(...) | Test.java:105:10:105:15 | break |
| Test.java:102:15:102:15 | <anonymous local variable> | Test.java:102:18:102:18 | <anonymous local variable> |
| Test.java:102:18:102:18 | <anonymous local variable> | Test.java:102:13:102:19 | B(...) |
| Test.java:103:8:103:77 | case <Pattern> | Test.java:103:21:103:21 | <anonymous local variable> |
| Test.java:103:8:103:77 | case <Pattern> | Test.java:103:31:103:31 | <anonymous local variable> |
| Test.java:103:8:103:77 | case <Pattern> | Test.java:103:36:103:36 | <anonymous local variable> |
| Test.java:103:8:103:77 | case <Pattern> | Test.java:104:8:104:20 | case <Pattern> |
| Test.java:103:21:103:21 | <anonymous local variable> | Test.java:103:47:103:51 | thing |
| Test.java:103:31:103:31 | <anonymous local variable> | Test.java:103:47:103:51 | thing |
| Test.java:103:34:103:40 | A(...) | Test.java:103:47:103:51 | thing |
| Test.java:103:36:103:36 | <anonymous local variable> | Test.java:103:39:103:39 | <anonymous local variable> |
| Test.java:103:39:103:39 | <anonymous local variable> | Test.java:103:34:103:40 | A(...) |
| Test.java:103:47:103:51 | thing | Test.java:103:47:103:62 | toString(...) |
| Test.java:103:47:103:62 | toString(...) | Test.java:103:71:103:75 | "abc" |
| Test.java:103:47:103:76 | equals(...) | Test.java:104:8:104:20 | case <Pattern> |
| Test.java:103:47:103:76 | equals(...) | Test.java:105:10:105:15 | break |
| Test.java:103:71:103:75 | "abc" | Test.java:103:47:103:76 | equals(...) |
| Test.java:104:8:104:20 | case <Pattern> | Test.java:104:19:104:19 | <anonymous local variable> |
| Test.java:104:8:104:20 | case <Pattern> | Test.java:106:8:106:15 | default |
| Test.java:104:19:104:19 | <anonymous local variable> | Test.java:105:10:105:15 | break |
| Test.java:105:10:105:15 | break | Test.java:110:6:117:7 | var ...; |
| Test.java:106:8:106:15 | default | Test.java:107:10:107:15 | break |
| Test.java:107:10:107:15 | break | Test.java:110:6:117:7 | var ...; |
| Test.java:110:6:117:7 | var ...; | Test.java:110:19:110:31 | switch (...) |
| Test.java:110:10:110:31 | result | Test.java:3:22:3:25 | test |
| Test.java:110:19:110:31 | switch (...) | Test.java:110:26:110:30 | thing |
| Test.java:110:26:110:30 | thing | Test.java:111:8:111:20 | case <Pattern> |
| Test.java:111:8:111:20 | case <Pattern> | Test.java:111:15:111:15 | <anonymous local variable> |
| Test.java:111:8:111:20 | case <Pattern> | Test.java:112:8:112:77 | case <Pattern> |
| Test.java:111:13:111:19 | B(...) | Test.java:114:10:114:17 | yield ... |
| Test.java:111:15:111:15 | <anonymous local variable> | Test.java:111:18:111:18 | <anonymous local variable> |
| Test.java:111:18:111:18 | <anonymous local variable> | Test.java:111:13:111:19 | B(...) |
| Test.java:112:8:112:77 | case <Pattern> | Test.java:112:21:112:21 | <anonymous local variable> |
| Test.java:112:8:112:77 | case <Pattern> | Test.java:112:31:112:31 | <anonymous local variable> |
| Test.java:112:8:112:77 | case <Pattern> | Test.java:112:36:112:36 | <anonymous local variable> |
| Test.java:112:8:112:77 | case <Pattern> | Test.java:113:8:113:20 | case <Pattern> |
| Test.java:112:21:112:21 | <anonymous local variable> | Test.java:112:47:112:51 | thing |
| Test.java:112:31:112:31 | <anonymous local variable> | Test.java:112:47:112:51 | thing |
| Test.java:112:34:112:40 | A(...) | Test.java:112:47:112:51 | thing |
| Test.java:112:36:112:36 | <anonymous local variable> | Test.java:112:39:112:39 | <anonymous local variable> |
| Test.java:112:39:112:39 | <anonymous local variable> | Test.java:112:34:112:40 | A(...) |
| Test.java:112:47:112:51 | thing | Test.java:112:47:112:62 | toString(...) |
| Test.java:112:47:112:62 | toString(...) | Test.java:112:71:112:75 | "abc" |
| Test.java:112:47:112:76 | equals(...) | Test.java:113:8:113:20 | case <Pattern> |
| Test.java:112:47:112:76 | equals(...) | Test.java:114:10:114:17 | yield ... |
| Test.java:112:71:112:75 | "abc" | Test.java:112:47:112:76 | equals(...) |
| Test.java:113:8:113:20 | case <Pattern> | Test.java:113:19:113:19 | <anonymous local variable> |
| Test.java:113:8:113:20 | case <Pattern> | Test.java:115:8:115:15 | default |
| Test.java:113:19:113:19 | <anonymous local variable> | Test.java:114:10:114:17 | yield ... |
| Test.java:114:10:114:17 | yield ... | Test.java:114:16:114:16 | 1 |
| Test.java:114:16:114:16 | 1 | Test.java:110:10:110:31 | result |
| Test.java:115:8:115:15 | default | Test.java:116:10:116:17 | yield ... |
| Test.java:116:10:116:17 | yield ... | Test.java:116:16:116:16 | 2 |
| Test.java:116:16:116:16 | 2 | Test.java:110:10:110:31 | result |
| Test.java:123:8:123:8 | ...=... | Test.java:123:8:123:8 | <Expr>; |
| Test.java:123:8:123:8 | ...=... | Test.java:123:8:123:8 | A |
| Test.java:123:8:123:8 | <Expr>; | Test.java:123:8:123:8 | this |
| Test.java:123:8:123:8 | <Expr>; | Test.java:123:8:123:8 | this |
| Test.java:123:8:123:8 | b | Test.java:123:8:123:8 | ...=... |
| Test.java:123:8:123:8 | field3 | Test.java:123:8:123:8 | ...=... |
| Test.java:123:8:123:8 | super(...) | Test.java:123:8:123:8 | <Expr>; |
| Test.java:123:8:123:8 | this | Test.java:123:8:123:8 | b |
| Test.java:123:8:123:8 | this | Test.java:123:8:123:8 | field3 |
| Test.java:123:8:123:8 | { ... } | Test.java:123:8:123:8 | super(...) |
| Test.java:124:8:124:8 | ...=... | Test.java:124:8:124:8 | <Expr>; |
| Test.java:124:8:124:8 | ...=... | Test.java:124:8:124:8 | B |
| Test.java:124:8:124:8 | <Expr>; | Test.java:124:8:124:8 | this |
| Test.java:124:8:124:8 | <Expr>; | Test.java:124:8:124:8 | this |
| Test.java:124:8:124:8 | field1 | Test.java:124:8:124:8 | ...=... |
| Test.java:124:8:124:8 | field2 | Test.java:124:8:124:8 | ...=... |
| Test.java:124:8:124:8 | super(...) | Test.java:124:8:124:8 | <Expr>; |
| Test.java:124:8:124:8 | this | Test.java:124:8:124:8 | field1 |
| Test.java:124:8:124:8 | this | Test.java:124:8:124:8 | field2 |
| Test.java:124:8:124:8 | { ... } | Test.java:124:8:124:8 | super(...) |