Skip to content

Commit 508c7e6

Browse files
authored
Merge pull request #18314 from paldepind/rust-tuple-ref-patterns
Rust: Add read steps for tuple and reference patterns
2 parents be939dc + 09fd27a commit 508c7e6

File tree

6 files changed

+144
-26
lines changed

6 files changed

+144
-26
lines changed

rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,12 @@ module RustDataFlow implements InputSig<Location> {
10101010
node2.asPat() = pat.getField(pos)
10111011
)
10121012
or
1013+
exists(TuplePatCfgNode pat, int pos |
1014+
pos = c.(TuplePositionContent).getPosition() and
1015+
node1.asPat() = pat and
1016+
node2.asPat() = pat.getField(pos)
1017+
)
1018+
or
10131019
exists(RecordPatCfgNode pat, string field |
10141020
pat = node1.asPat() and
10151021
(
@@ -1023,6 +1029,9 @@ module RustDataFlow implements InputSig<Location> {
10231029
node2.asPat() = pat.getFieldPat(field)
10241030
)
10251031
or
1032+
c instanceof ReferenceContent and
1033+
node1.asPat().(RefPatCfgNode).getPat() = node2.asPat()
1034+
or
10261035
exists(FieldExprCfgNode access |
10271036
// Read of a tuple entry
10281037
fieldTuplePositionContent(access, c) and

rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,9 @@ readStep
539539
| main.rs:87:11:87:11 | i | &ref | main.rs:87:10:87:11 | * ... |
540540
| main.rs:95:10:95:10 | a | tuple.0 | main.rs:95:10:95:12 | a.0 |
541541
| main.rs:96:10:96:10 | a | tuple.1 | main.rs:96:10:96:12 | a.1 |
542+
| main.rs:101:9:101:20 | TuplePat | tuple.0 | main.rs:101:10:101:11 | a0 |
543+
| main.rs:101:9:101:20 | TuplePat | tuple.1 | main.rs:101:14:101:15 | a1 |
544+
| main.rs:101:9:101:20 | TuplePat | tuple.2 | main.rs:101:18:101:19 | a2 |
542545
| main.rs:109:10:109:10 | a | tuple.0 | main.rs:109:10:109:12 | a.0 |
543546
| main.rs:110:10:110:10 | a | tuple.1 | main.rs:110:10:110:12 | a.1 |
544547
| main.rs:111:5:111:5 | a | tuple.0 | main.rs:111:5:111:7 | a.0 |
@@ -603,6 +606,8 @@ readStep
603606
| main.rs:384:5:384:11 | mut_arr | array[] | main.rs:384:5:384:14 | mut_arr[1] |
604607
| main.rs:385:13:385:19 | mut_arr | array[] | main.rs:385:13:385:22 | mut_arr[1] |
605608
| main.rs:387:10:387:16 | mut_arr | array[] | main.rs:387:10:387:19 | mut_arr[0] |
609+
| main.rs:394:7:394:18 | TuplePat | tuple.0 | main.rs:394:8:394:11 | cond |
610+
| main.rs:394:7:394:18 | TuplePat | tuple.1 | main.rs:394:14:394:17 | name |
606611
| main.rs:394:23:394:27 | names | array[] | main.rs:394:7:394:18 | TuplePat |
607612
| main.rs:396:35:396:61 | [post] \|...\| ... | captured default_name | main.rs:396:35:396:61 | [post] default_name |
608613
| main.rs:396:38:396:49 | this | captured default_name | main.rs:396:38:396:49 | default_name |

rust/ql/test/library-tests/dataflow/local/inline-flow.expected

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ edges
1919
| main.rs:94:13:94:26 | TupleExpr [tuple.0] | main.rs:94:9:94:9 | a [tuple.0] | provenance | |
2020
| main.rs:94:14:94:22 | source(...) | main.rs:94:13:94:26 | TupleExpr [tuple.0] | provenance | |
2121
| main.rs:95:10:95:10 | a [tuple.0] | main.rs:95:10:95:12 | a.0 | provenance | |
22+
| main.rs:100:9:100:9 | a [tuple.1] | main.rs:101:9:101:20 | TuplePat [tuple.1] | provenance | |
23+
| main.rs:100:13:100:30 | TupleExpr [tuple.1] | main.rs:100:9:100:9 | a [tuple.1] | provenance | |
24+
| main.rs:100:17:100:26 | source(...) | main.rs:100:13:100:30 | TupleExpr [tuple.1] | provenance | |
25+
| main.rs:101:9:101:20 | TuplePat [tuple.1] | main.rs:101:14:101:15 | a1 | provenance | |
26+
| main.rs:101:14:101:15 | a1 | main.rs:103:10:103:11 | a1 | provenance | |
2227
| main.rs:108:9:108:13 | a [tuple.1] | main.rs:110:10:110:10 | a [tuple.1] | provenance | |
2328
| main.rs:108:17:108:31 | TupleExpr [tuple.1] | main.rs:108:9:108:13 | a [tuple.1] | provenance | |
2429
| main.rs:108:21:108:30 | source(...) | main.rs:108:17:108:31 | TupleExpr [tuple.1] | provenance | |
@@ -171,6 +176,12 @@ nodes
171176
| main.rs:94:14:94:22 | source(...) | semmle.label | source(...) |
172177
| main.rs:95:10:95:10 | a [tuple.0] | semmle.label | a [tuple.0] |
173178
| main.rs:95:10:95:12 | a.0 | semmle.label | a.0 |
179+
| main.rs:100:9:100:9 | a [tuple.1] | semmle.label | a [tuple.1] |
180+
| main.rs:100:13:100:30 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] |
181+
| main.rs:100:17:100:26 | source(...) | semmle.label | source(...) |
182+
| main.rs:101:9:101:20 | TuplePat [tuple.1] | semmle.label | TuplePat [tuple.1] |
183+
| main.rs:101:14:101:15 | a1 | semmle.label | a1 |
184+
| main.rs:103:10:103:11 | a1 | semmle.label | a1 |
174185
| main.rs:108:9:108:13 | a [tuple.1] | semmle.label | a [tuple.1] |
175186
| main.rs:108:17:108:31 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] |
176187
| main.rs:108:21:108:30 | source(...) | semmle.label | source(...) |
@@ -329,6 +340,7 @@ testFailures
329340
| main.rs:47:10:47:10 | b | main.rs:45:15:45:23 | source(...) | main.rs:47:10:47:10 | b | $@ | main.rs:45:15:45:23 | source(...) | source(...) |
330341
| main.rs:54:10:54:10 | i | main.rs:53:9:53:17 | source(...) | main.rs:54:10:54:10 | i | $@ | main.rs:53:9:53:17 | source(...) | source(...) |
331342
| main.rs:95:10:95:12 | a.0 | main.rs:94:14:94:22 | source(...) | main.rs:95:10:95:12 | a.0 | $@ | main.rs:94:14:94:22 | source(...) | source(...) |
343+
| main.rs:103:10:103:11 | a1 | main.rs:100:17:100:26 | source(...) | main.rs:103:10:103:11 | a1 | $@ | main.rs:100:17:100:26 | source(...) | source(...) |
332344
| main.rs:110:10:110:12 | a.1 | main.rs:108:21:108:30 | source(...) | main.rs:110:10:110:12 | a.1 | $@ | main.rs:108:21:108:30 | source(...) | source(...) |
333345
| main.rs:113:10:113:12 | a.0 | main.rs:111:11:111:20 | source(...) | main.rs:113:10:113:12 | a.0 | $@ | main.rs:111:11:111:20 | source(...) | source(...) |
334346
| main.rs:121:10:121:15 | ... .1 | main.rs:118:17:118:26 | source(...) | main.rs:121:10:121:15 | ... .1 | $@ | main.rs:118:17:118:26 | source(...) | source(...) |

rust/ql/test/library-tests/dataflow/local/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ fn tuple_match() {
100100
let a = (2, source(38), 2);
101101
let (a0, a1, a2) = a;
102102
sink(a0);
103-
sink(a1); // $ MISSING: hasValueFlow=38
103+
sink(a1); // $ hasValueFlow=38
104104
sink(a2);
105105
}
106106

rust/ql/test/library-tests/dataflow/pointers/inline-flow.expected

Lines changed: 82 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,42 @@ edges
88
| main.rs:15:9:15:9 | c | main.rs:16:10:16:10 | c | provenance | |
99
| main.rs:15:13:15:14 | * ... | main.rs:15:9:15:9 | c | provenance | |
1010
| main.rs:15:14:15:14 | b [&ref] | main.rs:15:13:15:14 | * ... | provenance | |
11-
| main.rs:40:18:40:21 | SelfParam [MyNumber] | main.rs:41:15:41:18 | self [MyNumber] | provenance | |
12-
| main.rs:41:15:41:18 | self [MyNumber] | main.rs:42:13:42:38 | ...::MyNumber(...) [MyNumber] | provenance | |
13-
| main.rs:42:13:42:38 | ...::MyNumber(...) [MyNumber] | main.rs:42:32:42:37 | number | provenance | |
14-
| main.rs:42:32:42:37 | number | main.rs:40:31:46:5 | { ... } | provenance | |
15-
| main.rs:58:9:58:17 | my_number [MyNumber] | main.rs:59:10:59:18 | my_number [MyNumber] | provenance | |
16-
| main.rs:58:21:58:50 | ...::MyNumber(...) [MyNumber] | main.rs:58:9:58:17 | my_number [MyNumber] | provenance | |
17-
| main.rs:58:40:58:49 | source(...) | main.rs:58:21:58:50 | ...::MyNumber(...) [MyNumber] | provenance | |
18-
| main.rs:59:10:59:18 | my_number [MyNumber] | main.rs:40:18:40:21 | SelfParam [MyNumber] | provenance | |
19-
| main.rs:59:10:59:18 | my_number [MyNumber] | main.rs:59:10:59:30 | my_number.to_number(...) | provenance | |
11+
| main.rs:35:25:35:26 | &... [&ref] | main.rs:35:26:35:26 | n | provenance | |
12+
| main.rs:35:25:35:32 | ...: ... [&ref] | main.rs:35:25:35:26 | &... [&ref] | provenance | |
13+
| main.rs:35:26:35:26 | n | main.rs:36:10:36:10 | n | provenance | |
14+
| main.rs:40:9:40:11 | val | main.rs:41:27:41:29 | val | provenance | |
15+
| main.rs:40:15:40:24 | source(...) | main.rs:40:9:40:11 | val | provenance | |
16+
| main.rs:41:26:41:29 | &val [&ref] | main.rs:35:25:35:32 | ...: ... [&ref] | provenance | |
17+
| main.rs:41:27:41:29 | val | main.rs:41:26:41:29 | &val [&ref] | provenance | |
18+
| main.rs:49:18:49:21 | SelfParam [MyNumber] | main.rs:50:15:50:18 | self [MyNumber] | provenance | |
19+
| main.rs:50:15:50:18 | self [MyNumber] | main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | provenance | |
20+
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | main.rs:51:32:51:37 | number | provenance | |
21+
| main.rs:51:32:51:37 | number | main.rs:49:31:55:5 | { ... } | provenance | |
22+
| main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | main.rs:58:15:58:18 | self [&ref, MyNumber] | provenance | |
23+
| main.rs:58:15:58:18 | self [&ref, MyNumber] | main.rs:59:13:59:39 | &... [&ref, MyNumber] | provenance | |
24+
| main.rs:59:13:59:39 | &... [&ref, MyNumber] | main.rs:59:14:59:39 | ...::MyNumber(...) [MyNumber] | provenance | |
25+
| main.rs:59:14:59:39 | ...::MyNumber(...) [MyNumber] | main.rs:59:33:59:38 | number | provenance | |
26+
| main.rs:59:33:59:38 | number | main.rs:57:33:63:5 | { ... } | provenance | |
27+
| main.rs:67:9:67:17 | my_number [MyNumber] | main.rs:68:10:68:18 | my_number [MyNumber] | provenance | |
28+
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | main.rs:67:9:67:17 | my_number [MyNumber] | provenance | |
29+
| main.rs:67:40:67:49 | source(...) | main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | provenance | |
30+
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:49:18:49:21 | SelfParam [MyNumber] | provenance | |
31+
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:68:10:68:30 | my_number.to_number(...) | provenance | |
32+
| main.rs:77:9:77:17 | my_number [&ref, MyNumber] | main.rs:78:10:78:18 | my_number [&ref, MyNumber] | provenance | |
33+
| main.rs:77:21:77:51 | &... [&ref, MyNumber] | main.rs:77:9:77:17 | my_number [&ref, MyNumber] | provenance | |
34+
| main.rs:77:22:77:51 | ...::MyNumber(...) [MyNumber] | main.rs:77:21:77:51 | &... [&ref, MyNumber] | provenance | |
35+
| main.rs:77:41:77:50 | source(...) | main.rs:77:22:77:51 | ...::MyNumber(...) [MyNumber] | provenance | |
36+
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | provenance | |
37+
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | main.rs:78:10:78:31 | my_number.get_number(...) | provenance | |
38+
| main.rs:82:9:82:9 | a [&ref, tuple.0] | main.rs:85:19:85:19 | a [&ref, tuple.0] | provenance | |
39+
| main.rs:82:13:82:28 | &... [&ref, tuple.0] | main.rs:82:9:82:9 | a [&ref, tuple.0] | provenance | |
40+
| main.rs:82:14:82:28 | TupleExpr [tuple.0] | main.rs:82:13:82:28 | &... [&ref, tuple.0] | provenance | |
41+
| main.rs:82:15:82:24 | source(...) | main.rs:82:14:82:28 | TupleExpr [tuple.0] | provenance | |
42+
| main.rs:85:9:85:9 | b | main.rs:88:10:88:10 | b | provenance | |
43+
| main.rs:85:19:85:19 | a [&ref, tuple.0] | main.rs:86:9:86:15 | &... [&ref, tuple.0] | provenance | |
44+
| main.rs:86:9:86:15 | &... [&ref, tuple.0] | main.rs:86:10:86:15 | TuplePat [tuple.0] | provenance | |
45+
| main.rs:86:10:86:15 | TuplePat [tuple.0] | main.rs:86:11:86:11 | n | provenance | |
46+
| main.rs:86:11:86:11 | n | main.rs:85:9:85:9 | b | provenance | |
2047
nodes
2148
| main.rs:13:9:13:9 | a | semmle.label | a |
2249
| main.rs:13:13:13:22 | source(...) | semmle.label | source(...) |
@@ -27,19 +54,53 @@ nodes
2754
| main.rs:15:13:15:14 | * ... | semmle.label | * ... |
2855
| main.rs:15:14:15:14 | b [&ref] | semmle.label | b [&ref] |
2956
| main.rs:16:10:16:10 | c | semmle.label | c |
30-
| main.rs:40:18:40:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
31-
| main.rs:40:31:46:5 | { ... } | semmle.label | { ... } |
32-
| main.rs:41:15:41:18 | self [MyNumber] | semmle.label | self [MyNumber] |
33-
| main.rs:42:13:42:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
34-
| main.rs:42:32:42:37 | number | semmle.label | number |
35-
| main.rs:58:9:58:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
36-
| main.rs:58:21:58:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
37-
| main.rs:58:40:58:49 | source(...) | semmle.label | source(...) |
38-
| main.rs:59:10:59:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
39-
| main.rs:59:10:59:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
57+
| main.rs:35:25:35:26 | &... [&ref] | semmle.label | &... [&ref] |
58+
| main.rs:35:25:35:32 | ...: ... [&ref] | semmle.label | ...: ... [&ref] |
59+
| main.rs:35:26:35:26 | n | semmle.label | n |
60+
| main.rs:36:10:36:10 | n | semmle.label | n |
61+
| main.rs:40:9:40:11 | val | semmle.label | val |
62+
| main.rs:40:15:40:24 | source(...) | semmle.label | source(...) |
63+
| main.rs:41:26:41:29 | &val [&ref] | semmle.label | &val [&ref] |
64+
| main.rs:41:27:41:29 | val | semmle.label | val |
65+
| main.rs:49:18:49:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
66+
| main.rs:49:31:55:5 | { ... } | semmle.label | { ... } |
67+
| main.rs:50:15:50:18 | self [MyNumber] | semmle.label | self [MyNumber] |
68+
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
69+
| main.rs:51:32:51:37 | number | semmle.label | number |
70+
| main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | semmle.label | SelfParam [&ref, MyNumber] |
71+
| main.rs:57:33:63:5 | { ... } | semmle.label | { ... } |
72+
| main.rs:58:15:58:18 | self [&ref, MyNumber] | semmle.label | self [&ref, MyNumber] |
73+
| main.rs:59:13:59:39 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
74+
| main.rs:59:14:59:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
75+
| main.rs:59:33:59:38 | number | semmle.label | number |
76+
| main.rs:67:9:67:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
77+
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
78+
| main.rs:67:40:67:49 | source(...) | semmle.label | source(...) |
79+
| main.rs:68:10:68:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
80+
| main.rs:68:10:68:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
81+
| main.rs:77:9:77:17 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
82+
| main.rs:77:21:77:51 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
83+
| main.rs:77:22:77:51 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
84+
| main.rs:77:41:77:50 | source(...) | semmle.label | source(...) |
85+
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
86+
| main.rs:78:10:78:31 | my_number.get_number(...) | semmle.label | my_number.get_number(...) |
87+
| main.rs:82:9:82:9 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
88+
| main.rs:82:13:82:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
89+
| main.rs:82:14:82:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] |
90+
| main.rs:82:15:82:24 | source(...) | semmle.label | source(...) |
91+
| main.rs:85:9:85:9 | b | semmle.label | b |
92+
| main.rs:85:19:85:19 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
93+
| main.rs:86:9:86:15 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
94+
| main.rs:86:10:86:15 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] |
95+
| main.rs:86:11:86:11 | n | semmle.label | n |
96+
| main.rs:88:10:88:10 | b | semmle.label | b |
4097
subpaths
41-
| main.rs:59:10:59:18 | my_number [MyNumber] | main.rs:40:18:40:21 | SelfParam [MyNumber] | main.rs:40:31:46:5 | { ... } | main.rs:59:10:59:30 | my_number.to_number(...) |
98+
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:49:18:49:21 | SelfParam [MyNumber] | main.rs:49:31:55:5 | { ... } | main.rs:68:10:68:30 | my_number.to_number(...) |
99+
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | main.rs:57:33:63:5 | { ... } | main.rs:78:10:78:31 | my_number.get_number(...) |
42100
testFailures
43101
#select
44102
| main.rs:16:10:16:10 | c | main.rs:13:13:13:22 | source(...) | main.rs:16:10:16:10 | c | $@ | main.rs:13:13:13:22 | source(...) | source(...) |
45-
| main.rs:59:10:59:30 | my_number.to_number(...) | main.rs:58:40:58:49 | source(...) | main.rs:59:10:59:30 | my_number.to_number(...) | $@ | main.rs:58:40:58:49 | source(...) | source(...) |
103+
| main.rs:36:10:36:10 | n | main.rs:40:15:40:24 | source(...) | main.rs:36:10:36:10 | n | $@ | main.rs:40:15:40:24 | source(...) | source(...) |
104+
| main.rs:68:10:68:30 | my_number.to_number(...) | main.rs:67:40:67:49 | source(...) | main.rs:68:10:68:30 | my_number.to_number(...) | $@ | main.rs:67:40:67:49 | source(...) | source(...) |
105+
| main.rs:78:10:78:31 | my_number.get_number(...) | main.rs:77:41:77:50 | source(...) | main.rs:78:10:78:31 | my_number.get_number(...) | $@ | main.rs:77:41:77:50 | source(...) | source(...) |
106+
| main.rs:88:10:88:10 | b | main.rs:82:15:82:24 | source(...) | main.rs:88:10:88:10 | b | $@ | main.rs:82:15:82:24 | source(...) | source(...) |

rust/ql/test/library-tests/dataflow/pointers/main.rs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// -----------------------------------------------------------------------------
2-
// Data flow through pointers.
2+
// Data flow through borrows and pointers.
33

44
fn source(i: i64) -> i64 {
55
1000 + i
@@ -32,6 +32,15 @@ fn write_and_read_through_borrow() {
3232
sink(*b); // $ MISSING: hasValueFlow=37
3333
}
3434

35+
fn takes_borrowed_value(&n: &i64) {
36+
sink(n); // $ hasValueFlow=83
37+
}
38+
39+
fn pass_borrowed_value() {
40+
let val = source(83);
41+
takes_borrowed_value(&val);
42+
}
43+
3544
enum MyNumber {
3645
MyNumber(i64)
3746
}
@@ -47,8 +56,8 @@ impl MyNumber {
4756

4857
fn get_number(&self) -> i64 {
4958
match self {
50-
MyNumber::MyNumber(number) => {
51-
*number
59+
&MyNumber::MyNumber(number) => {
60+
number
5261
}
5362
}
5463
}
@@ -66,14 +75,36 @@ fn through_self_in_method_implicit_borrow() {
6675

6776
fn through_self_in_method_explicit_borrow() {
6877
let my_number = &MyNumber::MyNumber(source(40));
69-
sink(my_number.get_number()); // $ MISSING: hasValueFlow=40
78+
sink(my_number.get_number()); // $ hasValueFlow=40
79+
}
80+
81+
fn ref_nested_pattern_match() {
82+
let a = &(source(23), 1);
83+
84+
// Match "in order", ref then tuple
85+
let b = match a {
86+
&(n, _) => n
87+
};
88+
sink(b); // $ hasValueFlow=23
89+
90+
// Match "out of order", tuple then ref
91+
let c = match a {
92+
(n, _) => {
93+
match n {
94+
&i => i
95+
}
96+
}
97+
};
98+
sink(c); // $ MISSING: hasValueFlow=23
7099
}
71100

72101
fn main() {
73102
read_through_borrow();
74103
write_through_borrow();
75104
write_and_read_through_borrow();
105+
pass_borrowed_value();
76106
through_self_in_method_no_borrow();
77107
through_self_in_method_implicit_borrow();
78108
through_self_in_method_explicit_borrow();
109+
ref_nested_pattern_match();
79110
}

0 commit comments

Comments
 (0)