diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index c70ab0049d56..24b0efd28a46 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -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 | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 3d54b1a4b6a4..467248219a4c 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -520,6 +520,33 @@ mod m21 { } } +mod m23 { + #[rustfmt::skip] + trait Trait1< + T // I1 + > { + fn f(&self); // I3 + } // I2 + + struct S; // I4 + + #[rustfmt::skip] + impl Trait1< + Self // $ item=I4 + > // $ item=I2 + for S { // $ item=I4 + fn f(&self) { + println!("m23::>::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 @@ -547,4 +574,5 @@ fn main() { my3::f(); // $ item=I200 nested_f(); // $ item=I201 m18::m19::m20::g(); // $ item=I103 + m23::f(); // $ item=I108 } diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index a7ead02db842..1d480f2f5ad9 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -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 | @@ -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 | @@ -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 | @@ -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 | @@ -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(main@0.0.1) | -| 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(main@0.0.1) | +| 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 | @@ -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 |