Skip to content

Commit 74583e4

Browse files
authored
Merge pull request #19227 from paldepind/rust-pr-self
Rust: Resolve `Self` path in trait type of implementation
2 parents 76c0b16 + 5dba241 commit 74583e4

File tree

3 files changed

+96
-59
lines changed

3 files changed

+96
-59
lines changed

Diff for: rust/ql/lib/codeql/rust/internal/PathResolution.qll

+2
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ abstract class ImplOrTraitItemNode extends ItemNode {
372372
/** Gets an item that may refer to this node using `Self`. */
373373
pragma[nomagic]
374374
ItemNode getAnItemInSelfScope() {
375+
result = this
376+
or
375377
result.getImmediateParent() = this
376378
or
377379
exists(ItemNode mid |

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

+28
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,33 @@ mod m21 {
520520
}
521521
}
522522

523+
mod m23 {
524+
#[rustfmt::skip]
525+
trait Trait1<
526+
T // I1
527+
> {
528+
fn f(&self); // I3
529+
} // I2
530+
531+
struct S; // I4
532+
533+
#[rustfmt::skip]
534+
impl Trait1<
535+
Self // $ item=I4
536+
> // $ item=I2
537+
for S { // $ item=I4
538+
fn f(&self) {
539+
println!("m23::<S as Trait1<S>>::f");
540+
} // I5
541+
}
542+
543+
#[rustfmt::skip]
544+
pub fn f() {
545+
let x = S; // $ item=I4
546+
x.f(); // $ item=I5
547+
} // I108
548+
}
549+
523550
fn main() {
524551
my::nested::nested1::nested2::f(); // $ item=I4
525552
my::f(); // $ item=I38
@@ -547,4 +574,5 @@ fn main() {
547574
my3::f(); // $ item=I200
548575
nested_f(); // $ item=I201
549576
m18::m19::m20::g(); // $ item=I103
577+
m23::f(); // $ item=I108
550578
}

Diff for: rust/ql/test/library-tests/path-resolution/path-resolution.expected

+66-59
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ mod
2727
| main.rs:496:1:521:1 | mod m21 |
2828
| main.rs:497:5:503:5 | mod m22 |
2929
| main.rs:505:5:520:5 | mod m33 |
30+
| main.rs:523:1:548:1 | mod m23 |
3031
| my2/mod.rs:1:1:1:16 | mod nested2 |
3132
| my2/mod.rs:12:1:12:12 | mod my3 |
3233
| my2/nested2.rs:1:1:11:1 | mod nested3 |
@@ -59,7 +60,7 @@ resolvePath
5960
| main.rs:30:17:30:21 | super | main.rs:18:5:36:5 | mod m2 |
6061
| main.rs:30:17:30:24 | ...::f | main.rs:19:9:21:9 | fn f |
6162
| main.rs:33:17:33:17 | f | main.rs:19:9:21:9 | fn f |
62-
| main.rs:40:9:40:13 | super | main.rs:1:1:550:2 | SourceFile |
63+
| main.rs:40:9:40:13 | super | main.rs:1:1:578:2 | SourceFile |
6364
| main.rs:40:9:40:17 | ...::m1 | main.rs:13:1:37:1 | mod m1 |
6465
| main.rs:40:9:40:21 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
6566
| main.rs:40:9:40:24 | ...::g | main.rs:23:9:27:9 | fn g |
@@ -71,7 +72,7 @@ resolvePath
7172
| main.rs:61:17:61:19 | Foo | main.rs:59:9:59:21 | struct Foo |
7273
| main.rs:64:13:64:15 | Foo | main.rs:53:5:53:17 | struct Foo |
7374
| main.rs:66:5:66:5 | f | main.rs:55:5:62:5 | fn f |
74-
| main.rs:68:5:68:8 | self | main.rs:1:1:550:2 | SourceFile |
75+
| main.rs:68:5:68:8 | self | main.rs:1:1:578:2 | SourceFile |
7576
| main.rs:68:5:68:11 | ...::i | main.rs:71:1:83:1 | fn i |
7677
| main.rs:74:13:74:15 | Foo | main.rs:48:1:48:13 | struct Foo |
7778
| main.rs:81:17:81:19 | Foo | main.rs:77:9:79:9 | struct Foo |
@@ -85,7 +86,7 @@ resolvePath
8586
| main.rs:87:57:87:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
8687
| main.rs:87:80:87:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
8788
| main.rs:100:5:100:22 | f_defined_in_macro | main.rs:99:18:99:42 | fn f_defined_in_macro |
88-
| main.rs:117:13:117:17 | super | main.rs:1:1:550:2 | SourceFile |
89+
| main.rs:117:13:117:17 | super | main.rs:1:1:578:2 | SourceFile |
8990
| main.rs:117:13:117:21 | ...::m5 | main.rs:103:1:107:1 | mod m5 |
9091
| main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f |
9192
| main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f |
@@ -234,61 +235,67 @@ resolvePath
234235
| main.rs:517:21:517:26 | MyEnum | main.rs:498:9:500:9 | enum MyEnum |
235236
| main.rs:517:21:517:29 | ...::A | main.rs:499:13:499:13 | A |
236237
| main.rs:518:21:518:28 | MyStruct | main.rs:502:9:502:28 | struct MyStruct |
237-
| main.rs:524:5:524:6 | my | main.rs:1:1:1:7 | mod my |
238-
| main.rs:524:5:524:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
239-
| main.rs:524:5:524:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
240-
| main.rs:524:5:524:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
241-
| main.rs:524:5:524:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
242-
| main.rs:525:5:525:6 | my | main.rs:1:1:1:7 | mod my |
243-
| main.rs:525:5:525:9 | ...::f | my.rs:5:1:7:1 | fn f |
244-
| main.rs:526:5:526:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
245-
| main.rs:526:5:526:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
246-
| main.rs:526:5:526:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
247-
| main.rs:526:5:526:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
248-
| main.rs:527:5:527:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
249-
| main.rs:528:5:528:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
250-
| main.rs:529:5:529:9 | crate | main.rs:0:0:0:0 | Crate([email protected]) |
251-
| main.rs:529:5:529:12 | ...::h | main.rs:50:1:69:1 | fn h |
252-
| main.rs:530:5:530:6 | m1 | main.rs:13:1:37:1 | mod m1 |
253-
| main.rs:530:5:530:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
254-
| main.rs:530:5:530:13 | ...::g | main.rs:23:9:27:9 | fn g |
255-
| main.rs:531:5:531:6 | m1 | main.rs:13:1:37:1 | mod m1 |
256-
| main.rs:531:5:531:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
257-
| main.rs:531:5:531:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
258-
| main.rs:531:5:531:17 | ...::h | main.rs:30:27:34:13 | fn h |
259-
| main.rs:532:5:532:6 | m4 | main.rs:39:1:46:1 | mod m4 |
260-
| main.rs:532:5:532:9 | ...::i | main.rs:42:5:45:5 | fn i |
261-
| main.rs:533:5:533:5 | h | main.rs:50:1:69:1 | fn h |
262-
| main.rs:534:5:534:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
263-
| main.rs:535:5:535:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
264-
| main.rs:536:5:536:5 | j | main.rs:97:1:101:1 | fn j |
265-
| main.rs:537:5:537:6 | m6 | main.rs:109:1:120:1 | mod m6 |
266-
| main.rs:537:5:537:9 | ...::g | main.rs:114:5:119:5 | fn g |
267-
| main.rs:538:5:538:6 | m7 | main.rs:122:1:137:1 | mod m7 |
268-
| main.rs:538:5:538:9 | ...::f | main.rs:129:5:136:5 | fn f |
269-
| main.rs:539:5:539:6 | m8 | main.rs:139:1:193:1 | mod m8 |
270-
| main.rs:539:5:539:9 | ...::g | main.rs:177:5:192:5 | fn g |
271-
| main.rs:540:5:540:6 | m9 | main.rs:195:1:203:1 | mod m9 |
272-
| main.rs:540:5:540:9 | ...::f | main.rs:198:5:202:5 | fn f |
273-
| main.rs:541:5:541:7 | m11 | main.rs:226:1:263:1 | mod m11 |
274-
| main.rs:541:5:541:10 | ...::f | main.rs:231:5:234:5 | fn f |
275-
| main.rs:542:5:542:7 | m15 | main.rs:294:1:348:1 | mod m15 |
276-
| main.rs:542:5:542:10 | ...::f | main.rs:335:5:347:5 | fn f |
277-
| main.rs:543:5:543:7 | m16 | main.rs:350:1:442:1 | mod m16 |
278-
| main.rs:543:5:543:10 | ...::f | main.rs:417:5:441:5 | fn f |
279-
| main.rs:544:5:544:7 | m17 | main.rs:444:1:474:1 | mod m17 |
280-
| main.rs:544:5:544:10 | ...::f | main.rs:468:5:473:5 | fn f |
281-
| main.rs:545:5:545:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
282-
| main.rs:545:5:545:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
283-
| main.rs:546:5:546:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
284-
| main.rs:546:5:546:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
285-
| main.rs:547:5:547:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
286-
| main.rs:547:5:547:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
287-
| main.rs:548:5:548:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
288-
| main.rs:549:5:549:7 | m18 | main.rs:476:1:494:1 | mod m18 |
289-
| main.rs:549:5:549:12 | ...::m19 | main.rs:481:5:493:5 | mod m19 |
290-
| main.rs:549:5:549:17 | ...::m20 | main.rs:486:9:492:9 | mod m20 |
291-
| main.rs:549:5:549:20 | ...::g | main.rs:487:13:491:13 | fn g |
238+
| main.rs:534:10:536:5 | Trait1::<...> | main.rs:524:5:529:5 | trait Trait1 |
239+
| main.rs:535:7:535:10 | Self | main.rs:531:5:531:13 | struct S |
240+
| main.rs:537:11:537:11 | S | main.rs:531:5:531:13 | struct S |
241+
| main.rs:545:17:545:17 | S | main.rs:531:5:531:13 | struct S |
242+
| main.rs:551:5:551:6 | my | main.rs:1:1:1:7 | mod my |
243+
| main.rs:551:5:551:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
244+
| main.rs:551:5:551:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
245+
| main.rs:551:5:551:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
246+
| main.rs:551:5:551:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
247+
| main.rs:552:5:552:6 | my | main.rs:1:1:1:7 | mod my |
248+
| main.rs:552:5:552:9 | ...::f | my.rs:5:1:7:1 | fn f |
249+
| main.rs:553:5:553:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
250+
| main.rs:553:5:553:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
251+
| main.rs:553:5:553:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
252+
| main.rs:553:5:553:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
253+
| main.rs:554:5:554:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
254+
| main.rs:555:5:555:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
255+
| main.rs:556:5:556:9 | crate | main.rs:0:0:0:0 | Crate([email protected]) |
256+
| main.rs:556:5:556:12 | ...::h | main.rs:50:1:69:1 | fn h |
257+
| main.rs:557:5:557:6 | m1 | main.rs:13:1:37:1 | mod m1 |
258+
| main.rs:557:5:557:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
259+
| main.rs:557:5:557:13 | ...::g | main.rs:23:9:27:9 | fn g |
260+
| main.rs:558:5:558:6 | m1 | main.rs:13:1:37:1 | mod m1 |
261+
| main.rs:558:5:558:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
262+
| main.rs:558:5:558:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
263+
| main.rs:558:5:558:17 | ...::h | main.rs:30:27:34:13 | fn h |
264+
| main.rs:559:5:559:6 | m4 | main.rs:39:1:46:1 | mod m4 |
265+
| main.rs:559:5:559:9 | ...::i | main.rs:42:5:45:5 | fn i |
266+
| main.rs:560:5:560:5 | h | main.rs:50:1:69:1 | fn h |
267+
| main.rs:561:5:561:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
268+
| main.rs:562:5:562:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
269+
| main.rs:563:5:563:5 | j | main.rs:97:1:101:1 | fn j |
270+
| main.rs:564:5:564:6 | m6 | main.rs:109:1:120:1 | mod m6 |
271+
| main.rs:564:5:564:9 | ...::g | main.rs:114:5:119:5 | fn g |
272+
| main.rs:565:5:565:6 | m7 | main.rs:122:1:137:1 | mod m7 |
273+
| main.rs:565:5:565:9 | ...::f | main.rs:129:5:136:5 | fn f |
274+
| main.rs:566:5:566:6 | m8 | main.rs:139:1:193:1 | mod m8 |
275+
| main.rs:566:5:566:9 | ...::g | main.rs:177:5:192:5 | fn g |
276+
| main.rs:567:5:567:6 | m9 | main.rs:195:1:203:1 | mod m9 |
277+
| main.rs:567:5:567:9 | ...::f | main.rs:198:5:202:5 | fn f |
278+
| main.rs:568:5:568:7 | m11 | main.rs:226:1:263:1 | mod m11 |
279+
| main.rs:568:5:568:10 | ...::f | main.rs:231:5:234:5 | fn f |
280+
| main.rs:569:5:569:7 | m15 | main.rs:294:1:348:1 | mod m15 |
281+
| main.rs:569:5:569:10 | ...::f | main.rs:335:5:347:5 | fn f |
282+
| main.rs:570:5:570:7 | m16 | main.rs:350:1:442:1 | mod m16 |
283+
| main.rs:570:5:570:10 | ...::f | main.rs:417:5:441:5 | fn f |
284+
| main.rs:571:5:571:7 | m17 | main.rs:444:1:474:1 | mod m17 |
285+
| main.rs:571:5:571:10 | ...::f | main.rs:468:5:473:5 | fn f |
286+
| main.rs:572:5:572:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
287+
| main.rs:572:5:572:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
288+
| main.rs:573:5:573:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
289+
| main.rs:573:5:573:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
290+
| main.rs:574:5:574:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
291+
| main.rs:574:5:574:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
292+
| main.rs:575:5:575:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
293+
| main.rs:576:5:576:7 | m18 | main.rs:476:1:494:1 | mod m18 |
294+
| main.rs:576:5:576:12 | ...::m19 | main.rs:481:5:493:5 | mod m19 |
295+
| main.rs:576:5:576:17 | ...::m20 | main.rs:486:9:492:9 | mod m20 |
296+
| main.rs:576:5:576:20 | ...::g | main.rs:487:13:491:13 | fn g |
297+
| main.rs:577:5:577:7 | m23 | main.rs:523:1:548:1 | mod m23 |
298+
| main.rs:577:5:577:10 | ...::f | main.rs:543:5:547:5 | fn f |
292299
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
293300
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
294301
| my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
@@ -302,7 +309,7 @@ resolvePath
302309
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
303310
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h |
304311
| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
305-
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:550:2 | SourceFile |
312+
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:578:2 | SourceFile |
306313
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h |
307314
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
308315
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |

0 commit comments

Comments
 (0)