Skip to content

Commit cc85a09

Browse files
committed
Rust: Add AI-generated test for path resolution of where clauses
1 parent 7ed8a85 commit cc85a09

File tree

4 files changed

+160
-63
lines changed

4 files changed

+160
-63
lines changed

rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ private module ResolveTest implements TestSig {
1818
private predicate commmentAt(string text, string filepath, int line) {
1919
exists(Comment c |
2020
c.getLocation().hasLocationInfo(filepath, line, _, _, _) and
21-
c.getCommentText() = text
21+
c.getCommentText().trim() = text
2222
)
2323
}
2424

rust/ql/test/library-tests/path-resolution/main.rs

+71
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,76 @@ mod m23 {
547547
} // I108
548548
}
549549

550+
mod m24 {
551+
trait TraitA {
552+
fn trait_a_method(&self); // I110
553+
} // I111
554+
555+
trait TraitB {
556+
fn trait_b_method(&self); // I112
557+
} // I113
558+
559+
#[rustfmt::skip]
560+
struct GenericStruct<T> { // I114
561+
data: T, // $ item=I114
562+
} // I115
563+
564+
#[rustfmt::skip]
565+
impl<T> // I1151
566+
GenericStruct<T> // $ item=I115 item=I1151
567+
where
568+
T: TraitA // $ item=I111 item=I1151
569+
{
570+
fn call_trait_a(&self) {
571+
self.data.trait_a_method(); // $ MISSING: item=I110
572+
} // I116
573+
}
574+
575+
#[rustfmt::skip]
576+
impl<T> // I1161
577+
GenericStruct<T> // $ item=I115 item=I1161
578+
where
579+
T: TraitB, // $ item=I113 item=I1161
580+
T: TraitA, // $ item=I111 item=I1161
581+
{
582+
fn call_both(&self) {
583+
self.data.trait_a_method(); // $ MISSING: item=I110
584+
self.data.trait_b_method(); // $ MISSING: item=I112
585+
} // I117
586+
}
587+
588+
struct Implementor; // I118
589+
590+
#[rustfmt::skip]
591+
impl TraitA for Implementor { // $ item=I111 item=I118
592+
fn trait_a_method(&self) {
593+
println!("TraitA method called");
594+
} // I119
595+
}
596+
597+
#[rustfmt::skip]
598+
impl TraitB for Implementor { // $ item=I113 item=I118
599+
fn trait_b_method(&self) {
600+
println!("TraitB method called");
601+
} // I120
602+
}
603+
604+
#[rustfmt::skip]
605+
pub fn f() {
606+
let impl_obj = Implementor; // $ item=I118
607+
let generic = GenericStruct { data: impl_obj }; // $ item=I115
608+
609+
generic.call_trait_a(); // $ MISSING: item=I116
610+
generic.call_both(); // $ MISSING: item=I117
611+
612+
// Access through where clause type parameter constraint
613+
GenericStruct::<Implementor>::call_trait_a(&generic); // $ item=I116 item=I118
614+
615+
// Type that satisfies multiple trait bounds in where clause
616+
GenericStruct::<Implementor>::call_both(&generic); // $ item=I117 item=I118
617+
} // I121
618+
}
619+
550620
fn main() {
551621
my::nested::nested1::nested2::f(); // $ item=I4
552622
my::f(); // $ item=I38
@@ -575,4 +645,5 @@ fn main() {
575645
nested_f(); // $ item=I201
576646
m18::m19::m20::g(); // $ item=I103
577647
m23::f(); // $ item=I108
648+
m24::f(); // $ item=I121
578649
}

rust/ql/test/library-tests/path-resolution/path-resolution.expected

+87-61
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ mod
2828
| main.rs:497:5:503:5 | mod m22 |
2929
| main.rs:505:5:520:5 | mod m33 |
3030
| main.rs:523:1:548:1 | mod m23 |
31+
| main.rs:550:1:618:1 | mod m24 |
3132
| my2/mod.rs:1:1:1:16 | mod nested2 |
3233
| my2/mod.rs:12:1:12:12 | mod my3 |
3334
| my2/mod.rs:14:1:15:10 | mod mymod |
@@ -61,7 +62,7 @@ resolvePath
6162
| main.rs:30:17:30:21 | super | main.rs:18:5:36:5 | mod m2 |
6263
| main.rs:30:17:30:24 | ...::f | main.rs:19:9:21:9 | fn f |
6364
| main.rs:33:17:33:17 | f | main.rs:19:9:21:9 | fn f |
64-
| main.rs:40:9:40:13 | super | main.rs:1:1:578:2 | SourceFile |
65+
| main.rs:40:9:40:13 | super | main.rs:1:1:649:2 | SourceFile |
6566
| main.rs:40:9:40:17 | ...::m1 | main.rs:13:1:37:1 | mod m1 |
6667
| main.rs:40:9:40:21 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
6768
| main.rs:40:9:40:24 | ...::g | main.rs:23:9:27:9 | fn g |
@@ -73,7 +74,7 @@ resolvePath
7374
| main.rs:61:17:61:19 | Foo | main.rs:59:9:59:21 | struct Foo |
7475
| main.rs:64:13:64:15 | Foo | main.rs:53:5:53:17 | struct Foo |
7576
| main.rs:66:5:66:5 | f | main.rs:55:5:62:5 | fn f |
76-
| main.rs:68:5:68:8 | self | main.rs:1:1:578:2 | SourceFile |
77+
| main.rs:68:5:68:8 | self | main.rs:1:1:649:2 | SourceFile |
7778
| main.rs:68:5:68:11 | ...::i | main.rs:71:1:83:1 | fn i |
7879
| main.rs:74:13:74:15 | Foo | main.rs:48:1:48:13 | struct Foo |
7980
| main.rs:81:17:81:19 | Foo | main.rs:77:9:79:9 | struct Foo |
@@ -87,7 +88,7 @@ resolvePath
8788
| main.rs:87:57:87:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
8889
| main.rs:87:80:87:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
8990
| main.rs:100:5:100:22 | f_defined_in_macro | main.rs:99:18:99:42 | fn f_defined_in_macro |
90-
| main.rs:117:13:117:17 | super | main.rs:1:1:578:2 | SourceFile |
91+
| main.rs:117:13:117:17 | super | main.rs:1:1:649:2 | SourceFile |
9192
| main.rs:117:13:117:21 | ...::m5 | main.rs:103:1:107:1 | mod m5 |
9293
| main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f |
9394
| main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f |
@@ -240,63 +241,88 @@ resolvePath
240241
| main.rs:535:7:535:10 | Self | main.rs:531:5:531:13 | struct S |
241242
| main.rs:537:11:537:11 | S | main.rs:531:5:531:13 | struct S |
242243
| main.rs:545:17:545:17 | S | main.rs:531:5:531:13 | struct S |
243-
| main.rs:551:5:551:6 | my | main.rs:1:1:1:7 | mod my |
244-
| main.rs:551:5:551:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
245-
| main.rs:551:5:551:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
246-
| main.rs:551:5:551:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
247-
| main.rs:551:5:551:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
248-
| main.rs:552:5:552:6 | my | main.rs:1:1:1:7 | mod my |
249-
| main.rs:552:5:552:9 | ...::f | my.rs:5:1:7:1 | fn f |
250-
| main.rs:553:5:553:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
251-
| main.rs:553:5:553:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
252-
| main.rs:553:5:553:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
253-
| main.rs:553:5:553:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
254-
| main.rs:554:5:554:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
255-
| main.rs:555:5:555:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
256-
| main.rs:556:5:556:9 | crate | main.rs:0:0:0:0 | Crate([email protected]) |
257-
| main.rs:556:5:556:12 | ...::h | main.rs:50:1:69:1 | fn h |
258-
| main.rs:557:5:557:6 | m1 | main.rs:13:1:37:1 | mod m1 |
259-
| main.rs:557:5:557:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
260-
| main.rs:557:5:557:13 | ...::g | main.rs:23:9:27:9 | fn g |
261-
| main.rs:558:5:558:6 | m1 | main.rs:13:1:37:1 | mod m1 |
262-
| main.rs:558:5:558:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
263-
| main.rs:558:5:558:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
264-
| main.rs:558:5:558:17 | ...::h | main.rs:30:27:34:13 | fn h |
265-
| main.rs:559:5:559:6 | m4 | main.rs:39:1:46:1 | mod m4 |
266-
| main.rs:559:5:559:9 | ...::i | main.rs:42:5:45:5 | fn i |
267-
| main.rs:560:5:560:5 | h | main.rs:50:1:69:1 | fn h |
268-
| main.rs:561:5:561:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
269-
| main.rs:562:5:562:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
270-
| main.rs:563:5:563:5 | j | main.rs:97:1:101:1 | fn j |
271-
| main.rs:564:5:564:6 | m6 | main.rs:109:1:120:1 | mod m6 |
272-
| main.rs:564:5:564:9 | ...::g | main.rs:114:5:119:5 | fn g |
273-
| main.rs:565:5:565:6 | m7 | main.rs:122:1:137:1 | mod m7 |
274-
| main.rs:565:5:565:9 | ...::f | main.rs:129:5:136:5 | fn f |
275-
| main.rs:566:5:566:6 | m8 | main.rs:139:1:193:1 | mod m8 |
276-
| main.rs:566:5:566:9 | ...::g | main.rs:177:5:192:5 | fn g |
277-
| main.rs:567:5:567:6 | m9 | main.rs:195:1:203:1 | mod m9 |
278-
| main.rs:567:5:567:9 | ...::f | main.rs:198:5:202:5 | fn f |
279-
| main.rs:568:5:568:7 | m11 | main.rs:226:1:263:1 | mod m11 |
280-
| main.rs:568:5:568:10 | ...::f | main.rs:231:5:234:5 | fn f |
281-
| main.rs:569:5:569:7 | m15 | main.rs:294:1:348:1 | mod m15 |
282-
| main.rs:569:5:569:10 | ...::f | main.rs:335:5:347:5 | fn f |
283-
| main.rs:570:5:570:7 | m16 | main.rs:350:1:442:1 | mod m16 |
284-
| main.rs:570:5:570:10 | ...::f | main.rs:417:5:441:5 | fn f |
285-
| main.rs:571:5:571:7 | m17 | main.rs:444:1:474:1 | mod m17 |
286-
| main.rs:571:5:571:10 | ...::f | main.rs:468:5:473:5 | fn f |
287-
| main.rs:572:5:572:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
288-
| main.rs:572:5:572:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
289-
| main.rs:573:5:573:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
290-
| main.rs:573:5:573:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
291-
| main.rs:574:5:574:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
292-
| main.rs:574:5:574:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
293-
| main.rs:575:5:575:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
294-
| main.rs:576:5:576:7 | m18 | main.rs:476:1:494:1 | mod m18 |
295-
| main.rs:576:5:576:12 | ...::m19 | main.rs:481:5:493:5 | mod m19 |
296-
| main.rs:576:5:576:17 | ...::m20 | main.rs:486:9:492:9 | mod m20 |
297-
| main.rs:576:5:576:20 | ...::g | main.rs:487:13:491:13 | fn g |
298-
| main.rs:577:5:577:7 | m23 | main.rs:523:1:548:1 | mod m23 |
299-
| main.rs:577:5:577:10 | ...::f | main.rs:543:5:547:5 | fn f |
244+
| main.rs:561:15:561:15 | T | main.rs:560:26:560:26 | T |
245+
| main.rs:566:9:566:24 | GenericStruct::<...> | main.rs:559:5:562:5 | struct GenericStruct |
246+
| main.rs:566:23:566:23 | T | main.rs:565:10:565:10 | T |
247+
| main.rs:568:9:568:9 | T | main.rs:565:10:565:10 | T |
248+
| main.rs:568:12:568:17 | TraitA | main.rs:551:5:553:5 | trait TraitA |
249+
| main.rs:577:9:577:24 | GenericStruct::<...> | main.rs:559:5:562:5 | struct GenericStruct |
250+
| main.rs:577:23:577:23 | T | main.rs:576:10:576:10 | T |
251+
| main.rs:579:9:579:9 | T | main.rs:576:10:576:10 | T |
252+
| main.rs:579:12:579:17 | TraitB | main.rs:555:5:557:5 | trait TraitB |
253+
| main.rs:580:9:580:9 | T | main.rs:576:10:576:10 | T |
254+
| main.rs:580:12:580:17 | TraitA | main.rs:551:5:553:5 | trait TraitA |
255+
| main.rs:591:10:591:15 | TraitA | main.rs:551:5:553:5 | trait TraitA |
256+
| main.rs:591:21:591:31 | Implementor | main.rs:588:5:588:23 | struct Implementor |
257+
| main.rs:598:10:598:15 | TraitB | main.rs:555:5:557:5 | trait TraitB |
258+
| main.rs:598:21:598:31 | Implementor | main.rs:588:5:588:23 | struct Implementor |
259+
| main.rs:606:24:606:34 | Implementor | main.rs:588:5:588:23 | struct Implementor |
260+
| main.rs:607:23:607:35 | GenericStruct | main.rs:559:5:562:5 | struct GenericStruct |
261+
| main.rs:613:9:613:36 | GenericStruct::<...> | main.rs:559:5:562:5 | struct GenericStruct |
262+
| main.rs:613:9:613:50 | ...::call_trait_a | main.rs:570:9:572:9 | fn call_trait_a |
263+
| main.rs:613:25:613:35 | Implementor | main.rs:588:5:588:23 | struct Implementor |
264+
| main.rs:616:9:616:36 | GenericStruct::<...> | main.rs:559:5:562:5 | struct GenericStruct |
265+
| main.rs:616:9:616:47 | ...::call_both | main.rs:582:9:585:9 | fn call_both |
266+
| main.rs:616:25:616:35 | Implementor | main.rs:588:5:588:23 | struct Implementor |
267+
| main.rs:621:5:621:6 | my | main.rs:1:1:1:7 | mod my |
268+
| main.rs:621:5:621:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
269+
| main.rs:621:5:621:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
270+
| main.rs:621:5:621:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
271+
| main.rs:621:5:621:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
272+
| main.rs:622:5:622:6 | my | main.rs:1:1:1:7 | mod my |
273+
| main.rs:622:5:622:9 | ...::f | my.rs:5:1:7:1 | fn f |
274+
| main.rs:623:5:623:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
275+
| main.rs:623:5:623:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
276+
| main.rs:623:5:623:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
277+
| main.rs:623:5:623:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
278+
| main.rs:624:5:624:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
279+
| main.rs:625:5:625:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
280+
| main.rs:626:5:626:9 | crate | main.rs:0:0:0:0 | Crate([email protected]) |
281+
| main.rs:626:5:626:12 | ...::h | main.rs:50:1:69:1 | fn h |
282+
| main.rs:627:5:627:6 | m1 | main.rs:13:1:37:1 | mod m1 |
283+
| main.rs:627:5:627:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
284+
| main.rs:627:5:627:13 | ...::g | main.rs:23:9:27:9 | fn g |
285+
| main.rs:628:5:628:6 | m1 | main.rs:13:1:37:1 | mod m1 |
286+
| main.rs:628:5:628:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
287+
| main.rs:628:5:628:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
288+
| main.rs:628:5:628:17 | ...::h | main.rs:30:27:34:13 | fn h |
289+
| main.rs:629:5:629:6 | m4 | main.rs:39:1:46:1 | mod m4 |
290+
| main.rs:629:5:629:9 | ...::i | main.rs:42:5:45:5 | fn i |
291+
| main.rs:630:5:630:5 | h | main.rs:50:1:69:1 | fn h |
292+
| main.rs:631:5:631:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
293+
| main.rs:632:5:632:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
294+
| main.rs:633:5:633:5 | j | main.rs:97:1:101:1 | fn j |
295+
| main.rs:634:5:634:6 | m6 | main.rs:109:1:120:1 | mod m6 |
296+
| main.rs:634:5:634:9 | ...::g | main.rs:114:5:119:5 | fn g |
297+
| main.rs:635:5:635:6 | m7 | main.rs:122:1:137:1 | mod m7 |
298+
| main.rs:635:5:635:9 | ...::f | main.rs:129:5:136:5 | fn f |
299+
| main.rs:636:5:636:6 | m8 | main.rs:139:1:193:1 | mod m8 |
300+
| main.rs:636:5:636:9 | ...::g | main.rs:177:5:192:5 | fn g |
301+
| main.rs:637:5:637:6 | m9 | main.rs:195:1:203:1 | mod m9 |
302+
| main.rs:637:5:637:9 | ...::f | main.rs:198:5:202:5 | fn f |
303+
| main.rs:638:5:638:7 | m11 | main.rs:226:1:263:1 | mod m11 |
304+
| main.rs:638:5:638:10 | ...::f | main.rs:231:5:234:5 | fn f |
305+
| main.rs:639:5:639:7 | m15 | main.rs:294:1:348:1 | mod m15 |
306+
| main.rs:639:5:639:10 | ...::f | main.rs:335:5:347:5 | fn f |
307+
| main.rs:640:5:640:7 | m16 | main.rs:350:1:442:1 | mod m16 |
308+
| main.rs:640:5:640:10 | ...::f | main.rs:417:5:441:5 | fn f |
309+
| main.rs:641:5:641:7 | m17 | main.rs:444:1:474:1 | mod m17 |
310+
| main.rs:641:5:641:10 | ...::f | main.rs:468:5:473:5 | fn f |
311+
| main.rs:642:5:642:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
312+
| main.rs:642:5:642:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
313+
| main.rs:643:5:643:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
314+
| main.rs:643:5:643:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
315+
| main.rs:644:5:644:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
316+
| main.rs:644:5:644:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
317+
| main.rs:645:5:645:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
318+
| main.rs:646:5:646:7 | m18 | main.rs:476:1:494:1 | mod m18 |
319+
| main.rs:646:5:646:12 | ...::m19 | main.rs:481:5:493:5 | mod m19 |
320+
| main.rs:646:5:646:17 | ...::m20 | main.rs:486:9:492:9 | mod m20 |
321+
| main.rs:646:5:646:20 | ...::g | main.rs:487:13:491:13 | fn g |
322+
| main.rs:647:5:647:7 | m23 | main.rs:523:1:548:1 | mod m23 |
323+
| main.rs:647:5:647:10 | ...::f | main.rs:543:5:547:5 | fn f |
324+
| main.rs:648:5:648:7 | m24 | main.rs:550:1:618:1 | mod m24 |
325+
| main.rs:648:5:648:10 | ...::f | main.rs:604:5:617:5 | fn f |
300326
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
301327
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
302328
| my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
@@ -312,7 +338,7 @@ resolvePath
312338
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
313339
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h |
314340
| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:17:30 | SourceFile |
315-
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:578:2 | SourceFile |
341+
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:649:2 | SourceFile |
316342
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h |
317343
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:17:30 | SourceFile |
318344
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |

rust/ql/test/library-tests/variables/variables.ql

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module VariableAccessTest implements TestSig {
3131
private predicate commmentAt(string text, string filepath, int line) {
3232
exists(Comment c |
3333
c.getLocation().hasLocationInfo(filepath, line, _, _, _) and
34-
c.getCommentText() = text
34+
c.getCommentText().trim() = text
3535
)
3636
}
3737

0 commit comments

Comments
 (0)