Skip to content

Rust: Resolve Self path in trait type of implementation #19227

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 7, 2025
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions rust/ql/lib/codeql/rust/internal/PathResolution.qll
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,8 @@ abstract class ImplOrTraitItemNode extends ItemNode {
/** Gets an item that may refer to this node using `Self`. */
pragma[nomagic]
ItemNode getAnItemInSelfScope() {
result = this
or
result.getImmediateParent() = this
or
exists(ItemNode mid |
Expand Down
28 changes: 28 additions & 0 deletions rust/ql/test/library-tests/path-resolution/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,33 @@ mod m21 {
}
}

mod m23 {
#[rustfmt::skip]
trait Trait1<
T // I1
> {
fn f(&self); // // I3
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove extra //.

} // I2

struct S; // I4

#[rustfmt::skip]
impl Trait1<
Self // $ item=I4
> // $ item=I2
for S { // $ item=I4
fn f(&self) {
println!("m23::<S as Trait1<S>>::f");
} // I5
}

#[rustfmt::skip]
pub fn f() {
let x = S; // $ item=I4
x.f(); // $ item=I5
} // I108
}

fn main() {
my::nested::nested1::nested2::f(); // $ item=I4
my::f(); // $ item=I38
Expand Down Expand Up @@ -547,4 +574,5 @@ fn main() {
my3::f(); // $ item=I200
nested_f(); // $ item=I201
m18::m19::m20::g(); // $ item=I103
m23::f(); // $ item=I108
}
125 changes: 66 additions & 59 deletions rust/ql/test/library-tests/path-resolution/path-resolution.expected
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ mod
| main.rs:496:1:521:1 | mod m21 |
| main.rs:497:5:503:5 | mod m22 |
| main.rs:505:5:520:5 | mod m33 |
| main.rs:523:1:548:1 | mod m23 |
| my2/mod.rs:1:1:1:16 | mod nested2 |
| my2/mod.rs:12:1:12:12 | mod my3 |
| my2/nested2.rs:1:1:11:1 | mod nested3 |
Expand Down Expand Up @@ -59,7 +60,7 @@ resolvePath
| main.rs:30:17:30:21 | super | main.rs:18:5:36:5 | mod m2 |
| main.rs:30:17:30:24 | ...::f | main.rs:19:9:21:9 | fn f |
| main.rs:33:17:33:17 | f | main.rs:19:9:21:9 | fn f |
| main.rs:40:9:40:13 | super | main.rs:1:1:550:2 | SourceFile |
| main.rs:40:9:40:13 | super | main.rs:1:1:578:2 | SourceFile |
| main.rs:40:9:40:17 | ...::m1 | main.rs:13:1:37:1 | mod m1 |
| main.rs:40:9:40:21 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
| main.rs:40:9:40:24 | ...::g | main.rs:23:9:27:9 | fn g |
Expand All @@ -71,7 +72,7 @@ resolvePath
| main.rs:61:17:61:19 | Foo | main.rs:59:9:59:21 | struct Foo |
| main.rs:64:13:64:15 | Foo | main.rs:53:5:53:17 | struct Foo |
| main.rs:66:5:66:5 | f | main.rs:55:5:62:5 | fn f |
| main.rs:68:5:68:8 | self | main.rs:1:1:550:2 | SourceFile |
| main.rs:68:5:68:8 | self | main.rs:1:1:578:2 | SourceFile |
| main.rs:68:5:68:11 | ...::i | main.rs:71:1:83:1 | fn i |
| main.rs:74:13:74:15 | Foo | main.rs:48:1:48:13 | struct Foo |
| main.rs:81:17:81:19 | Foo | main.rs:77:9:79:9 | struct Foo |
Expand All @@ -85,7 +86,7 @@ resolvePath
| main.rs:87:57:87:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:87:80:87:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
| main.rs:100:5:100:22 | f_defined_in_macro | main.rs:99:18:99:42 | fn f_defined_in_macro |
| main.rs:117:13:117:17 | super | main.rs:1:1:550:2 | SourceFile |
| main.rs:117:13:117:17 | super | main.rs:1:1:578:2 | SourceFile |
| main.rs:117:13:117:21 | ...::m5 | main.rs:103:1:107:1 | mod m5 |
| main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f |
| main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f |
Expand Down Expand Up @@ -234,61 +235,67 @@ resolvePath
| main.rs:517:21:517:26 | MyEnum | main.rs:498:9:500:9 | enum MyEnum |
| main.rs:517:21:517:29 | ...::A | main.rs:499:13:499:13 | A |
| main.rs:518:21:518:28 | MyStruct | main.rs:502:9:502:28 | struct MyStruct |
| main.rs:524:5:524:6 | my | main.rs:1:1:1:7 | mod my |
| main.rs:524:5:524:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
| main.rs:524:5:524:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
| main.rs:524:5:524:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
| main.rs:524:5:524:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
| main.rs:525:5:525:6 | my | main.rs:1:1:1:7 | mod my |
| main.rs:525:5:525:9 | ...::f | my.rs:5:1:7:1 | fn f |
| main.rs:526:5:526:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| main.rs:526:5:526:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
| main.rs:526:5:526:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
| main.rs:526:5:526:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:527:5:527:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:528:5:528:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:529:5:529:9 | crate | main.rs:0:0:0:0 | Crate([email protected]) |
| main.rs:529:5:529:12 | ...::h | main.rs:50:1:69:1 | fn h |
| main.rs:530:5:530:6 | m1 | main.rs:13:1:37:1 | mod m1 |
| main.rs:530:5:530:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
| main.rs:530:5:530:13 | ...::g | main.rs:23:9:27:9 | fn g |
| main.rs:531:5:531:6 | m1 | main.rs:13:1:37:1 | mod m1 |
| main.rs:531:5:531:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
| main.rs:531:5:531:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
| main.rs:531:5:531:17 | ...::h | main.rs:30:27:34:13 | fn h |
| main.rs:532:5:532:6 | m4 | main.rs:39:1:46:1 | mod m4 |
| main.rs:532:5:532:9 | ...::i | main.rs:42:5:45:5 | fn i |
| main.rs:533:5:533:5 | h | main.rs:50:1:69:1 | fn h |
| main.rs:534:5:534:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:535:5:535:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:536:5:536:5 | j | main.rs:97:1:101:1 | fn j |
| main.rs:537:5:537:6 | m6 | main.rs:109:1:120:1 | mod m6 |
| main.rs:537:5:537:9 | ...::g | main.rs:114:5:119:5 | fn g |
| main.rs:538:5:538:6 | m7 | main.rs:122:1:137:1 | mod m7 |
| main.rs:538:5:538:9 | ...::f | main.rs:129:5:136:5 | fn f |
| main.rs:539:5:539:6 | m8 | main.rs:139:1:193:1 | mod m8 |
| main.rs:539:5:539:9 | ...::g | main.rs:177:5:192:5 | fn g |
| main.rs:540:5:540:6 | m9 | main.rs:195:1:203:1 | mod m9 |
| main.rs:540:5:540:9 | ...::f | main.rs:198:5:202:5 | fn f |
| main.rs:541:5:541:7 | m11 | main.rs:226:1:263:1 | mod m11 |
| main.rs:541:5:541:10 | ...::f | main.rs:231:5:234:5 | fn f |
| main.rs:542:5:542:7 | m15 | main.rs:294:1:348:1 | mod m15 |
| main.rs:542:5:542:10 | ...::f | main.rs:335:5:347:5 | fn f |
| main.rs:543:5:543:7 | m16 | main.rs:350:1:442:1 | mod m16 |
| main.rs:543:5:543:10 | ...::f | main.rs:417:5:441:5 | fn f |
| main.rs:544:5:544:7 | m17 | main.rs:444:1:474:1 | mod m17 |
| main.rs:544:5:544:10 | ...::f | main.rs:468:5:473:5 | fn f |
| main.rs:545:5:545:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
| main.rs:545:5:545:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
| main.rs:546:5:546:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
| main.rs:546:5:546:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
| main.rs:547:5:547:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
| main.rs:547:5:547:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
| main.rs:548:5:548:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
| main.rs:549:5:549:7 | m18 | main.rs:476:1:494:1 | mod m18 |
| main.rs:549:5:549:12 | ...::m19 | main.rs:481:5:493:5 | mod m19 |
| main.rs:549:5:549:17 | ...::m20 | main.rs:486:9:492:9 | mod m20 |
| main.rs:549:5:549:20 | ...::g | main.rs:487:13:491:13 | fn g |
| main.rs:534:10:536:5 | Trait1::<...> | main.rs:524:5:529:5 | trait Trait1 |
| main.rs:535:7:535:10 | Self | main.rs:531:5:531:13 | struct S |
| main.rs:537:11:537:11 | S | main.rs:531:5:531:13 | struct S |
| main.rs:545:17:545:17 | S | main.rs:531:5:531:13 | struct S |
| main.rs:551:5:551:6 | my | main.rs:1:1:1:7 | mod my |
| main.rs:551:5:551:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
| main.rs:551:5:551:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
| main.rs:551:5:551:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
| main.rs:551:5:551:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
| main.rs:552:5:552:6 | my | main.rs:1:1:1:7 | mod my |
| main.rs:552:5:552:9 | ...::f | my.rs:5:1:7:1 | fn f |
| main.rs:553:5:553:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| main.rs:553:5:553:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
| main.rs:553:5:553:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
| main.rs:553:5:553:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:554:5:554:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:555:5:555:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:556:5:556:9 | crate | main.rs:0:0:0:0 | Crate([email protected]) |
| main.rs:556:5:556:12 | ...::h | main.rs:50:1:69:1 | fn h |
| main.rs:557:5:557:6 | m1 | main.rs:13:1:37:1 | mod m1 |
| main.rs:557:5:557:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
| main.rs:557:5:557:13 | ...::g | main.rs:23:9:27:9 | fn g |
| main.rs:558:5:558:6 | m1 | main.rs:13:1:37:1 | mod m1 |
| main.rs:558:5:558:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
| main.rs:558:5:558:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
| main.rs:558:5:558:17 | ...::h | main.rs:30:27:34:13 | fn h |
| main.rs:559:5:559:6 | m4 | main.rs:39:1:46:1 | mod m4 |
| main.rs:559:5:559:9 | ...::i | main.rs:42:5:45:5 | fn i |
| main.rs:560:5:560:5 | h | main.rs:50:1:69:1 | fn h |
| main.rs:561:5:561:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:562:5:562:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:563:5:563:5 | j | main.rs:97:1:101:1 | fn j |
| main.rs:564:5:564:6 | m6 | main.rs:109:1:120:1 | mod m6 |
| main.rs:564:5:564:9 | ...::g | main.rs:114:5:119:5 | fn g |
| main.rs:565:5:565:6 | m7 | main.rs:122:1:137:1 | mod m7 |
| main.rs:565:5:565:9 | ...::f | main.rs:129:5:136:5 | fn f |
| main.rs:566:5:566:6 | m8 | main.rs:139:1:193:1 | mod m8 |
| main.rs:566:5:566:9 | ...::g | main.rs:177:5:192:5 | fn g |
| main.rs:567:5:567:6 | m9 | main.rs:195:1:203:1 | mod m9 |
| main.rs:567:5:567:9 | ...::f | main.rs:198:5:202:5 | fn f |
| main.rs:568:5:568:7 | m11 | main.rs:226:1:263:1 | mod m11 |
| main.rs:568:5:568:10 | ...::f | main.rs:231:5:234:5 | fn f |
| main.rs:569:5:569:7 | m15 | main.rs:294:1:348:1 | mod m15 |
| main.rs:569:5:569:10 | ...::f | main.rs:335:5:347:5 | fn f |
| main.rs:570:5:570:7 | m16 | main.rs:350:1:442:1 | mod m16 |
| main.rs:570:5:570:10 | ...::f | main.rs:417:5:441:5 | fn f |
| main.rs:571:5:571:7 | m17 | main.rs:444:1:474:1 | mod m17 |
| main.rs:571:5:571:10 | ...::f | main.rs:468:5:473:5 | fn f |
| main.rs:572:5:572:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
| main.rs:572:5:572:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
| main.rs:573:5:573:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
| main.rs:573:5:573:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
| main.rs:574:5:574:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
| main.rs:574:5:574:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
| main.rs:575:5:575:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
| main.rs:576:5:576:7 | m18 | main.rs:476:1:494:1 | mod m18 |
| main.rs:576:5:576:12 | ...::m19 | main.rs:481:5:493:5 | mod m19 |
| main.rs:576:5:576:17 | ...::m20 | main.rs:486:9:492:9 | mod m20 |
| main.rs:576:5:576:20 | ...::g | main.rs:487:13:491:13 | fn g |
| main.rs:577:5:577:7 | m23 | main.rs:523:1:548:1 | mod m23 |
| main.rs:577:5:577:10 | ...::f | main.rs:543:5:547:5 | fn f |
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
| my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
Expand All @@ -302,7 +309,7 @@ resolvePath
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h |
| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:550:2 | SourceFile |
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:578:2 | SourceFile |
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h |
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
Expand Down