From 17c3ee1745187b1696c7088407202db8d22b0e84 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 12 Nov 2025 13:40:39 +0100 Subject: [PATCH 1/8] Rust: More path resolution tests --- .../PathResolutionConsistency.expected | 5 +- .../library-tests/path-resolution/main.rs | 29 +- .../path-resolution/path-resolution.expected | 600 +++++++++--------- 3 files changed, 334 insertions(+), 300 deletions(-) diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 6b5461f37194..6291f1de06d7 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -2,5 +2,6 @@ multipleCallTargets | main.rs:126:9:126:11 | f(...) | | main.rs:366:9:368:16 | ...::f(...) | | main.rs:369:9:371:16 | ...::f(...) | -| main.rs:448:9:452:16 | ...::f(...) | -| main.rs:453:9:457:16 | ...::f(...) | +| main.rs:450:9:454:16 | ...::f(...) | +| main.rs:455:9:459:16 | ...::f(...) | +| main.rs:460:9:460:16 | ...::g(...) | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index c0f37bcd18eb..47a8dddeab84 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -381,8 +381,9 @@ mod m16 { > { fn f(&self) -> T; // $ item=I84 - fn g(&self) -> T // $ item=I84 - ; // I85 + fn g(&self) -> T {// $ item=I84 + self.f() // $ item=f + } // I85 fn h(&self) -> T { // $ item=I84 Self::g(&self); // $ item=I85 @@ -436,6 +437,7 @@ mod m16 { > // $ item=I89 for S { // $ item=I90 fn f(&self) -> S { // $ item=I90 + Self::g(&self); // $ MISSING: item=I92 $ SPURIOUS: item=I85 println!("m16::>::f"); // $ item=println Self::c // $ MISSING: item=I95 } // I93 @@ -455,7 +457,7 @@ mod m16 { S // $ item=I90 > // $ item=I89 >::f(&x); // $ MISSING: item=I93 - S::g(&x); // $ item=I92 + S::g(&x); // $ item=I92 $ SPURIOUS: item=I85 x.g(); // $ item=I92 S::h(&x); // $ item=I96 x.h(); // $ item=I96 @@ -466,6 +468,27 @@ mod m16 { > // $ item=I86 >::c; // $ MISSING: item=I95 } // I83 + + trait Trait3 { + fn f(&self); + } + + trait Trait4 { + fn g(&self); + } + + struct S2; + + impl Trait3 for S2 { // $ item=Trait3 item=S2 + fn f(&self) { } // S2asTrait3::f + } + + impl Trait4 for S2 { // $ item=Trait4 item=S2 + fn g(&self) { + Self::f(&self); // $ MISSING: item=S2asTrait3::f + S2::f(&self); // $ item=S2asTrait3::f + } + } } mod trait_visibility { 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 20c7e7799be7..1a904ce55418 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -18,21 +18,21 @@ mod | main.rs:291:1:304:1 | mod m13 | | main.rs:295:5:303:5 | mod m14 | | main.rs:306:1:375:1 | mod m15 | -| main.rs:377:1:469:1 | mod m16 | -| main.rs:471:1:521:1 | mod trait_visibility | -| main.rs:472:5:494:5 | mod m | -| main.rs:523:1:553:1 | mod m17 | -| main.rs:555:1:573:1 | mod m18 | -| main.rs:560:5:572:5 | mod m19 | -| main.rs:565:9:571:9 | mod m20 | -| main.rs:575:1:600:1 | mod m21 | -| main.rs:576:5:582:5 | mod m22 | -| main.rs:584:5:599:5 | mod m33 | -| main.rs:602:1:627:1 | mod m23 | -| main.rs:629:1:697:1 | mod m24 | -| main.rs:714:1:766:1 | mod associated_types | -| main.rs:772:1:791:1 | mod impl_with_attribute_macro | -| main.rs:793:1:834:1 | mod patterns | +| main.rs:377:1:492:1 | mod m16 | +| main.rs:494:1:544:1 | mod trait_visibility | +| main.rs:495:5:517:5 | mod m | +| main.rs:546:1:576:1 | mod m17 | +| main.rs:578:1:596:1 | mod m18 | +| main.rs:583:5:595:5 | mod m19 | +| main.rs:588:9:594:9 | mod m20 | +| main.rs:598:1:623:1 | mod m21 | +| main.rs:599:5:605:5 | mod m22 | +| main.rs:607:5:622:5 | mod m33 | +| main.rs:625:1:650:1 | mod m23 | +| main.rs:652:1:720:1 | mod m24 | +| main.rs:737:1:789:1 | mod associated_types | +| main.rs:795:1:814:1 | mod impl_with_attribute_macro | +| main.rs:816:1:857:1 | mod patterns | | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:20:1:20:12 | mod my3 | | my2/mod.rs:22:1:23:10 | mod mymod | @@ -73,7 +73,7 @@ resolvePath | main.rs:37:17:37:24 | ...::f | main.rs:26:9:28:9 | fn f | | main.rs:39:17:39:23 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:40:17:40:17 | f | main.rs:26:9:28:9 | fn f | -| main.rs:47:9:47:13 | super | main.rs:1:1:873:2 | SourceFile | +| main.rs:47:9:47:13 | super | main.rs:1:1:896:2 | SourceFile | | main.rs:47:9:47:17 | ...::m1 | main.rs:20:1:44:1 | mod m1 | | main.rs:47:9:47:21 | ...::m2 | main.rs:25:5:43:5 | mod m2 | | main.rs:47:9:47:24 | ...::g | main.rs:30:9:34:9 | fn g | @@ -88,7 +88,7 @@ resolvePath | main.rs:68:17:68:19 | Foo | main.rs:66:9:66:21 | struct Foo | | main.rs:71:13:71:15 | Foo | main.rs:60:5:60:17 | struct Foo | | main.rs:73:5:73:5 | f | main.rs:62:5:69:5 | fn f | -| main.rs:75:5:75:8 | self | main.rs:1:1:873:2 | SourceFile | +| main.rs:75:5:75:8 | self | main.rs:1:1:896:2 | SourceFile | | main.rs:75:5:75:11 | ...::i | main.rs:78:1:90:1 | fn i | | main.rs:79:5:79:11 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:81:13:81:15 | Foo | main.rs:55:1:55:13 | struct Foo | @@ -110,7 +110,7 @@ resolvePath | main.rs:112:9:112:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:118:9:118:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:122:9:122:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:125:13:125:17 | super | main.rs:1:1:873:2 | SourceFile | +| main.rs:125:13:125:17 | super | main.rs:1:1:896:2 | SourceFile | | main.rs:125:13:125:21 | ...::m5 | main.rs:110:1:114:1 | mod m5 | | main.rs:126:9:126:9 | f | main.rs:111:5:113:5 | fn f | | main.rs:126:9:126:9 | f | main.rs:117:5:119:5 | fn f | @@ -213,282 +213,292 @@ resolvePath | main.rs:372:9:372:12 | ...::g | main.rs:349:9:351:9 | fn g | | main.rs:382:24:382:24 | T | main.rs:380:7:380:7 | T | | main.rs:384:24:384:24 | T | main.rs:380:7:380:7 | T | -| main.rs:387:24:387:24 | T | main.rs:380:7:380:7 | T | -| main.rs:388:13:388:16 | Self | main.rs:378:5:394:5 | trait Trait1 | -| main.rs:388:13:388:19 | ...::g | main.rs:384:9:385:9 | fn g | -| main.rs:392:18:392:18 | T | main.rs:380:7:380:7 | T | -| main.rs:400:9:402:9 | Trait1::<...> | main.rs:378:5:394:5 | trait Trait1 | -| main.rs:401:11:401:11 | T | main.rs:398:7:398:7 | T | -| main.rs:403:24:403:24 | T | main.rs:398:7:398:7 | T | -| main.rs:404:13:404:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:405:13:405:16 | Self | main.rs:396:5:409:5 | trait Trait2 | -| main.rs:405:13:405:19 | ...::g | main.rs:384:9:385:9 | fn g | -| main.rs:407:13:407:16 | Self | main.rs:396:5:409:5 | trait Trait2 | -| main.rs:407:13:407:19 | ...::c | main.rs:392:9:393:9 | Const | -| main.rs:414:10:416:5 | Trait1::<...> | main.rs:378:5:394:5 | trait Trait1 | -| main.rs:415:7:415:7 | S | main.rs:411:5:411:13 | struct S | -| main.rs:417:11:417:11 | S | main.rs:411:5:411:13 | struct S | -| main.rs:418:24:418:24 | S | main.rs:411:5:411:13 | struct S | -| main.rs:419:13:419:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:420:13:420:16 | Self | main.rs:413:5:431:5 | impl Trait1::<...> for S { ... } | -| main.rs:420:13:420:19 | ...::g | main.rs:424:9:427:9 | fn g | -| main.rs:424:24:424:24 | S | main.rs:411:5:411:13 | struct S | -| main.rs:425:13:425:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:426:13:426:16 | Self | main.rs:413:5:431:5 | impl Trait1::<...> for S { ... } | -| main.rs:426:13:426:19 | ...::c | main.rs:429:9:430:9 | Const | -| main.rs:429:18:429:18 | S | main.rs:411:5:411:13 | struct S | -| main.rs:429:22:429:22 | S | main.rs:411:5:411:13 | struct S | -| main.rs:434:10:436:5 | Trait2::<...> | main.rs:396:5:409:5 | trait Trait2 | -| main.rs:435:7:435:7 | S | main.rs:411:5:411:13 | struct S | -| main.rs:437:11:437:11 | S | main.rs:411:5:411:13 | struct S | -| main.rs:438:24:438:24 | S | main.rs:411:5:411:13 | struct S | -| main.rs:439:13:439:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:440:13:440:16 | Self | main.rs:433:5:442:5 | impl Trait2::<...> for S { ... } | -| main.rs:446:9:446:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:447:17:447:17 | S | main.rs:411:5:411:13 | struct S | -| main.rs:448:10:448:10 | S | main.rs:411:5:411:13 | struct S | -| main.rs:449:14:451:11 | Trait1::<...> | main.rs:378:5:394:5 | trait Trait1 | -| main.rs:450:13:450:13 | S | main.rs:411:5:411:13 | struct S | -| main.rs:453:10:453:10 | S | main.rs:411:5:411:13 | struct S | -| main.rs:454:14:456:11 | Trait2::<...> | main.rs:396:5:409:5 | trait Trait2 | -| main.rs:455:13:455:13 | S | main.rs:411:5:411:13 | struct S | -| main.rs:458:9:458:9 | S | main.rs:411:5:411:13 | struct S | -| main.rs:458:9:458:12 | ...::g | main.rs:424:9:427:9 | fn g | -| main.rs:460:9:460:9 | S | main.rs:411:5:411:13 | struct S | -| main.rs:460:9:460:12 | ...::h | main.rs:387:9:390:9 | fn h | -| main.rs:462:9:462:9 | S | main.rs:411:5:411:13 | struct S | -| main.rs:462:9:462:12 | ...::c | main.rs:429:9:430:9 | Const | -| main.rs:463:10:463:10 | S | main.rs:411:5:411:13 | struct S | -| main.rs:464:14:466:11 | Trait1::<...> | main.rs:378:5:394:5 | trait Trait1 | -| main.rs:465:13:465:13 | S | main.rs:411:5:411:13 | struct S | -| main.rs:483:14:483:16 | Foo | main.rs:473:9:475:9 | trait Foo | -| main.rs:483:22:483:22 | X | main.rs:481:9:481:21 | struct X | -| main.rs:485:17:485:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:489:14:489:16 | Bar | main.rs:477:9:479:9 | trait Bar | -| main.rs:489:22:489:22 | X | main.rs:481:9:481:21 | struct X | -| main.rs:491:17:491:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:496:9:496:9 | m | main.rs:472:5:494:5 | mod m | -| main.rs:496:9:496:12 | ...::X | main.rs:481:9:481:21 | struct X | -| main.rs:499:17:499:17 | X | main.rs:481:9:481:21 | struct X | -| main.rs:502:17:502:17 | m | main.rs:472:5:494:5 | mod m | -| main.rs:502:17:502:22 | ...::Foo | main.rs:473:9:475:9 | trait Foo | -| main.rs:503:13:503:13 | X | main.rs:481:9:481:21 | struct X | -| main.rs:503:13:503:23 | ...::a_method | main.rs:483:26:486:13 | fn a_method | -| main.rs:507:17:507:17 | m | main.rs:472:5:494:5 | mod m | -| main.rs:507:17:507:22 | ...::Bar | main.rs:477:9:479:9 | trait Bar | -| main.rs:508:13:508:13 | X | main.rs:481:9:481:21 | struct X | -| main.rs:508:13:508:23 | ...::a_method | main.rs:489:26:492:13 | fn a_method | -| main.rs:512:17:512:17 | m | main.rs:472:5:494:5 | mod m | -| main.rs:512:17:512:22 | ...::Bar | main.rs:477:9:479:9 | trait Bar | -| main.rs:513:13:513:13 | X | main.rs:481:9:481:21 | struct X | -| main.rs:513:13:513:23 | ...::a_method | main.rs:489:26:492:13 | fn a_method | -| main.rs:518:13:518:13 | m | main.rs:472:5:494:5 | mod m | -| main.rs:518:13:518:18 | ...::Bar | main.rs:477:9:479:9 | trait Bar | -| main.rs:518:13:518:28 | ...::a_method | main.rs:478:13:478:31 | fn a_method | -| main.rs:531:10:531:16 | MyTrait | main.rs:524:5:526:5 | trait MyTrait | -| main.rs:532:9:532:9 | S | main.rs:528:5:528:13 | struct S | -| main.rs:534:13:534:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:540:7:540:13 | MyTrait | main.rs:524:5:526:5 | trait MyTrait | -| main.rs:541:10:541:10 | T | main.rs:539:10:539:10 | T | -| main.rs:543:9:543:9 | T | main.rs:539:10:539:10 | T | -| main.rs:543:9:543:12 | ...::f | main.rs:525:9:525:20 | fn f | -| main.rs:544:9:544:15 | MyTrait | main.rs:524:5:526:5 | trait MyTrait | -| main.rs:544:9:544:18 | ...::f | main.rs:525:9:525:20 | fn f | -| main.rs:549:9:549:9 | g | main.rs:538:5:545:5 | fn g | -| main.rs:550:11:550:11 | S | main.rs:528:5:528:13 | struct S | -| main.rs:557:9:557:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:562:13:562:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:567:17:567:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:568:17:568:21 | super | main.rs:560:5:572:5 | mod m19 | -| main.rs:568:17:568:24 | ...::f | main.rs:561:9:563:9 | fn f | -| main.rs:569:17:569:21 | super | main.rs:560:5:572:5 | mod m19 | -| main.rs:569:17:569:28 | ...::super | main.rs:555:1:573:1 | mod m18 | -| main.rs:569:17:569:31 | ...::f | main.rs:556:5:558:5 | fn f | -| main.rs:586:13:586:17 | super | main.rs:575:1:600:1 | mod m21 | -| main.rs:586:13:586:22 | ...::m22 | main.rs:576:5:582:5 | mod m22 | -| main.rs:586:13:586:30 | ...::MyEnum | main.rs:577:9:579:9 | enum MyEnum | -| main.rs:587:13:587:16 | self | main.rs:577:9:579:9 | enum MyEnum | -| main.rs:591:13:591:17 | super | main.rs:575:1:600:1 | mod m21 | -| main.rs:591:13:591:22 | ...::m22 | main.rs:576:5:582:5 | mod m22 | -| main.rs:591:13:591:32 | ...::MyStruct | main.rs:581:9:581:28 | struct MyStruct | -| main.rs:592:13:592:16 | self | main.rs:581:9:581:28 | struct MyStruct | -| main.rs:596:21:596:26 | MyEnum | main.rs:577:9:579:9 | enum MyEnum | -| main.rs:596:21:596:29 | ...::A | main.rs:578:13:578:13 | A | -| main.rs:597:21:597:28 | MyStruct | main.rs:581:9:581:28 | struct MyStruct | -| main.rs:613:10:615:5 | Trait1::<...> | main.rs:603:5:608:5 | trait Trait1 | -| main.rs:614:7:614:10 | Self | main.rs:610:5:610:13 | struct S | -| main.rs:616:11:616:11 | S | main.rs:610:5:610:13 | struct S | -| main.rs:618:13:618:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:624:17:624:17 | S | main.rs:610:5:610:13 | struct S | -| main.rs:640:15:640:15 | T | main.rs:639:26:639:26 | T | -| main.rs:645:9:645:24 | GenericStruct::<...> | main.rs:638:5:641:5 | struct GenericStruct | -| main.rs:645:23:645:23 | T | main.rs:644:10:644:10 | T | -| main.rs:647:9:647:9 | T | main.rs:644:10:644:10 | T | -| main.rs:647:12:647:17 | TraitA | main.rs:630:5:632:5 | trait TraitA | -| main.rs:656:9:656:24 | GenericStruct::<...> | main.rs:638:5:641:5 | struct GenericStruct | -| main.rs:656:23:656:23 | T | main.rs:655:10:655:10 | T | -| main.rs:658:9:658:9 | T | main.rs:655:10:655:10 | T | -| main.rs:658:12:658:17 | TraitB | main.rs:634:5:636:5 | trait TraitB | -| main.rs:659:9:659:9 | T | main.rs:655:10:655:10 | T | -| main.rs:659:12:659:17 | TraitA | main.rs:630:5:632:5 | trait TraitA | -| main.rs:670:10:670:15 | TraitA | main.rs:630:5:632:5 | trait TraitA | -| main.rs:670:21:670:31 | Implementor | main.rs:667:5:667:23 | struct Implementor | -| main.rs:672:13:672:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:677:10:677:15 | TraitB | main.rs:634:5:636:5 | trait TraitB | -| main.rs:677:21:677:31 | Implementor | main.rs:667:5:667:23 | struct Implementor | -| main.rs:679:13:679:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:685:24:685:34 | Implementor | main.rs:667:5:667:23 | struct Implementor | -| main.rs:686:23:686:35 | GenericStruct | main.rs:638:5:641:5 | struct GenericStruct | -| main.rs:692:9:692:36 | GenericStruct::<...> | main.rs:638:5:641:5 | struct GenericStruct | -| main.rs:692:9:692:50 | ...::call_trait_a | main.rs:649:9:651:9 | fn call_trait_a | -| main.rs:692:25:692:35 | Implementor | main.rs:667:5:667:23 | struct Implementor | -| main.rs:695:9:695:36 | GenericStruct::<...> | main.rs:638:5:641:5 | struct GenericStruct | -| main.rs:695:9:695:47 | ...::call_both | main.rs:661:9:664:9 | fn call_both | -| main.rs:695:25:695:35 | Implementor | main.rs:667:5:667:23 | struct Implementor | -| main.rs:701:3:701:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:701:3:701:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:705:6:705:12 | AStruct | main.rs:704:1:704:17 | struct AStruct | -| main.rs:707:7:707:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:707:7:707:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:710:7:710:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:710:7:710:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:715:9:715:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:715:9:715:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | -| main.rs:715:9:715:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:716:9:716:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:716:9:716:19 | ...::result | {EXTERNAL LOCATION} | mod result | -| main.rs:716:9:716:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | -| main.rs:724:19:724:22 | Self | main.rs:718:5:726:5 | trait Reduce | -| main.rs:724:19:724:29 | ...::Input | main.rs:719:9:719:19 | type Input | -| main.rs:725:14:725:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:725:21:725:24 | Self | main.rs:718:5:726:5 | trait Reduce | -| main.rs:725:21:725:32 | ...::Output | main.rs:720:21:721:20 | type Output | -| main.rs:725:35:725:38 | Self | main.rs:718:5:726:5 | trait Reduce | -| main.rs:725:35:725:45 | ...::Error | main.rs:719:21:720:19 | type Error | -| main.rs:729:17:729:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:729:29:729:33 | Input | main.rs:728:19:728:23 | Input | -| main.rs:730:17:730:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:730:29:730:33 | Error | main.rs:728:26:728:30 | Error | -| main.rs:737:11:737:16 | Reduce | main.rs:718:5:726:5 | trait Reduce | -| main.rs:738:13:741:9 | MyImpl::<...> | main.rs:728:5:731:5 | struct MyImpl | -| main.rs:739:13:739:17 | Input | main.rs:735:13:735:17 | Input | -| main.rs:740:13:740:17 | Error | main.rs:736:13:736:17 | Error | -| main.rs:743:22:746:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:744:13:744:17 | Input | main.rs:735:13:735:17 | Input | -| main.rs:745:13:745:16 | Self | main.rs:733:5:765:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:745:13:745:23 | ...::Error | main.rs:747:11:751:9 | type Error | -| main.rs:748:22:750:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:749:11:749:15 | Error | main.rs:736:13:736:17 | Error | -| main.rs:753:13:753:17 | Input | main.rs:735:13:735:17 | Input | -| main.rs:758:19:758:22 | Self | main.rs:733:5:765:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:758:19:758:29 | ...::Input | main.rs:743:9:747:9 | type Input | -| main.rs:759:14:762:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:760:13:760:16 | Self | main.rs:733:5:765:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:760:13:760:24 | ...::Output | main.rs:751:11:754:9 | type Output | -| main.rs:761:13:761:16 | Self | main.rs:733:5:765:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:761:13:761:23 | ...::Error | main.rs:747:11:751:9 | type Error | -| main.rs:768:5:768:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:768:11:768:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:770:15:770:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:770:15:770:25 | ...::string | {EXTERNAL LOCATION} | mod string | -| main.rs:770:15:770:33 | ...::String | {EXTERNAL LOCATION} | struct String | -| main.rs:780:7:780:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:780:7:780:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | -| main.rs:781:10:781:15 | ATrait | main.rs:776:5:778:5 | trait ATrait | -| main.rs:781:21:781:23 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:783:11:783:13 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:789:17:789:19 | Foo | main.rs:774:5:774:15 | struct Foo | -| main.rs:795:22:795:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:795:29:795:31 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:796:17:796:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:797:17:797:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:797:24:797:26 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:798:13:798:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:799:17:799:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:801:13:801:16 | None | {EXTERNAL LOCATION} | None | -| main.rs:802:17:802:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:811:19:811:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:811:26:811:28 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:812:26:812:29 | test | main.rs:794:5:808:5 | fn test | -| main.rs:818:14:818:16 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:823:17:823:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:825:13:825:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:830:13:830:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:830:18:830:18 | z | main.rs:817:5:819:12 | Const | -| main.rs:830:24:830:24 | z | main.rs:817:5:819:12 | Const | -| main.rs:837:5:837:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:837:5:837:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:837:5:837:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:837:5:837:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:837:5:837:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:838:5:838:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:838:5:838:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:839:5:839:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:839:5:839:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:839:5:839:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:839:5:839:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:840:5:840:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:841:5:841:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:842:5:842:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:842:5:842:12 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:843:5:843:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:843:5:843:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:843:5:843:13 | ...::g | main.rs:30:9:34:9 | fn g | -| main.rs:844:5:844:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:844:5:844:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:844:5:844:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | -| main.rs:844:5:844:17 | ...::h | main.rs:37:27:41:13 | fn h | -| main.rs:845:5:845:6 | m4 | main.rs:46:1:53:1 | mod m4 | -| main.rs:845:5:845:9 | ...::i | main.rs:49:5:52:5 | fn i | -| main.rs:846:5:846:5 | h | main.rs:57:1:76:1 | fn h | -| main.rs:847:5:847:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:848:5:848:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:849:5:849:5 | j | main.rs:104:1:108:1 | fn j | -| main.rs:850:5:850:6 | m6 | main.rs:116:1:128:1 | mod m6 | -| main.rs:850:5:850:9 | ...::g | main.rs:121:5:127:5 | fn g | -| main.rs:851:5:851:6 | m7 | main.rs:130:1:149:1 | mod m7 | -| main.rs:851:5:851:9 | ...::f | main.rs:141:5:148:5 | fn f | -| main.rs:852:5:852:6 | m8 | main.rs:151:1:205:1 | mod m8 | -| main.rs:852:5:852:9 | ...::g | main.rs:189:5:204:5 | fn g | -| main.rs:853:5:853:6 | m9 | main.rs:207:1:215:1 | mod m9 | -| main.rs:853:5:853:9 | ...::f | main.rs:210:5:214:5 | fn f | -| main.rs:854:5:854:7 | m11 | main.rs:238:1:275:1 | mod m11 | -| main.rs:854:5:854:10 | ...::f | main.rs:243:5:246:5 | fn f | -| main.rs:855:5:855:7 | m15 | main.rs:306:1:375:1 | mod m15 | -| main.rs:855:5:855:10 | ...::f | main.rs:362:5:374:5 | fn f | -| main.rs:856:5:856:7 | m16 | main.rs:377:1:469:1 | mod m16 | -| main.rs:856:5:856:10 | ...::f | main.rs:444:5:468:5 | fn f | -| main.rs:857:5:857:20 | trait_visibility | main.rs:471:1:521:1 | mod trait_visibility | -| main.rs:857:5:857:23 | ...::f | main.rs:498:5:520:5 | fn f | -| main.rs:858:5:858:7 | m17 | main.rs:523:1:553:1 | mod m17 | -| main.rs:858:5:858:10 | ...::f | main.rs:547:5:552:5 | fn f | -| main.rs:859:5:859:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:859:5:859:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:860:5:860:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:860:5:860:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:861:5:861:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | -| main.rs:861:5:861:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:862:5:862:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:863:5:863:12 | my_alias | main.rs:1:1:1:7 | mod my | -| main.rs:863:5:863:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:864:5:864:7 | m18 | main.rs:555:1:573:1 | mod m18 | -| main.rs:864:5:864:12 | ...::m19 | main.rs:560:5:572:5 | mod m19 | -| main.rs:864:5:864:17 | ...::m20 | main.rs:565:9:571:9 | mod m20 | -| main.rs:864:5:864:20 | ...::g | main.rs:566:13:570:13 | fn g | -| main.rs:865:5:865:7 | m23 | main.rs:602:1:627:1 | mod m23 | -| main.rs:865:5:865:10 | ...::f | main.rs:622:5:626:5 | fn f | -| main.rs:866:5:866:7 | m24 | main.rs:629:1:697:1 | mod m24 | -| main.rs:866:5:866:10 | ...::f | main.rs:683:5:696:5 | fn f | -| main.rs:867:5:867:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:867:5:867:11 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:868:5:868:13 | z_changed | main.rs:702:1:702:9 | fn z_changed | -| main.rs:869:5:869:11 | AStruct | main.rs:704:1:704:17 | struct AStruct | -| main.rs:869:5:869:22 | ...::z_on_type | main.rs:708:5:708:17 | fn z_on_type | -| main.rs:870:5:870:11 | AStruct | main.rs:704:1:704:17 | struct AStruct | -| main.rs:871:5:871:29 | impl_with_attribute_macro | main.rs:772:1:791:1 | mod impl_with_attribute_macro | -| main.rs:871:5:871:35 | ...::test | main.rs:787:5:790:5 | fn test | -| main.rs:872:5:872:12 | patterns | main.rs:793:1:834:1 | mod patterns | -| main.rs:872:5:872:18 | ...::test | main.rs:794:5:808:5 | fn test | +| main.rs:388:24:388:24 | T | main.rs:380:7:380:7 | T | +| main.rs:389:13:389:16 | Self | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:389:13:389:19 | ...::g | main.rs:384:9:386:9 | fn g | +| main.rs:393:18:393:18 | T | main.rs:380:7:380:7 | T | +| main.rs:401:9:403:9 | Trait1::<...> | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:402:11:402:11 | T | main.rs:399:7:399:7 | T | +| main.rs:404:24:404:24 | T | main.rs:399:7:399:7 | T | +| main.rs:405:13:405:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:406:13:406:16 | Self | main.rs:397:5:410:5 | trait Trait2 | +| main.rs:406:13:406:19 | ...::g | main.rs:384:9:386:9 | fn g | +| main.rs:408:13:408:16 | Self | main.rs:397:5:410:5 | trait Trait2 | +| main.rs:408:13:408:19 | ...::c | main.rs:393:9:394:9 | Const | +| main.rs:415:10:417:5 | Trait1::<...> | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:416:7:416:7 | S | main.rs:412:5:412:13 | struct S | +| main.rs:418:11:418:11 | S | main.rs:412:5:412:13 | struct S | +| main.rs:419:24:419:24 | S | main.rs:412:5:412:13 | struct S | +| main.rs:420:13:420:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:421:13:421:16 | Self | main.rs:414:5:432:5 | impl Trait1::<...> for S { ... } | +| main.rs:421:13:421:19 | ...::g | main.rs:425:9:428:9 | fn g | +| main.rs:425:24:425:24 | S | main.rs:412:5:412:13 | struct S | +| main.rs:426:13:426:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:427:13:427:16 | Self | main.rs:414:5:432:5 | impl Trait1::<...> for S { ... } | +| main.rs:427:13:427:19 | ...::c | main.rs:430:9:431:9 | Const | +| main.rs:430:18:430:18 | S | main.rs:412:5:412:13 | struct S | +| main.rs:430:22:430:22 | S | main.rs:412:5:412:13 | struct S | +| main.rs:435:10:437:5 | Trait2::<...> | main.rs:397:5:410:5 | trait Trait2 | +| main.rs:436:7:436:7 | S | main.rs:412:5:412:13 | struct S | +| main.rs:438:11:438:11 | S | main.rs:412:5:412:13 | struct S | +| main.rs:439:24:439:24 | S | main.rs:412:5:412:13 | struct S | +| main.rs:440:13:440:16 | Self | main.rs:434:5:444:5 | impl Trait2::<...> for S { ... } | +| main.rs:440:13:440:19 | ...::g | main.rs:384:9:386:9 | fn g | +| main.rs:441:13:441:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:442:13:442:16 | Self | main.rs:434:5:444:5 | impl Trait2::<...> for S { ... } | +| main.rs:448:9:448:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:449:17:449:17 | S | main.rs:412:5:412:13 | struct S | +| main.rs:450:10:450:10 | S | main.rs:412:5:412:13 | struct S | +| main.rs:451:14:453:11 | Trait1::<...> | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:452:13:452:13 | S | main.rs:412:5:412:13 | struct S | +| main.rs:455:10:455:10 | S | main.rs:412:5:412:13 | struct S | +| main.rs:456:14:458:11 | Trait2::<...> | main.rs:397:5:410:5 | trait Trait2 | +| main.rs:457:13:457:13 | S | main.rs:412:5:412:13 | struct S | +| main.rs:460:9:460:9 | S | main.rs:412:5:412:13 | struct S | +| main.rs:460:9:460:12 | ...::g | main.rs:384:9:386:9 | fn g | +| main.rs:460:9:460:12 | ...::g | main.rs:425:9:428:9 | fn g | +| main.rs:462:9:462:9 | S | main.rs:412:5:412:13 | struct S | +| main.rs:462:9:462:12 | ...::h | main.rs:388:9:391:9 | fn h | +| main.rs:464:9:464:9 | S | main.rs:412:5:412:13 | struct S | +| main.rs:464:9:464:12 | ...::c | main.rs:430:9:431:9 | Const | +| main.rs:465:10:465:10 | S | main.rs:412:5:412:13 | struct S | +| main.rs:466:14:468:11 | Trait1::<...> | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:467:13:467:13 | S | main.rs:412:5:412:13 | struct S | +| main.rs:482:10:482:15 | Trait3 | main.rs:472:5:474:5 | trait Trait3 | +| main.rs:482:21:482:22 | S2 | main.rs:480:5:480:14 | struct S2 | +| main.rs:486:10:486:15 | Trait4 | main.rs:476:5:478:5 | trait Trait4 | +| main.rs:486:21:486:22 | S2 | main.rs:480:5:480:14 | struct S2 | +| main.rs:488:13:488:16 | Self | main.rs:486:5:491:5 | impl Trait4 for S2 { ... } | +| main.rs:489:13:489:14 | S2 | main.rs:480:5:480:14 | struct S2 | +| main.rs:489:13:489:17 | ...::f | main.rs:482:26:483:23 | fn f | +| main.rs:506:14:506:16 | Foo | main.rs:496:9:498:9 | trait Foo | +| main.rs:506:22:506:22 | X | main.rs:504:9:504:21 | struct X | +| main.rs:508:17:508:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:512:14:512:16 | Bar | main.rs:500:9:502:9 | trait Bar | +| main.rs:512:22:512:22 | X | main.rs:504:9:504:21 | struct X | +| main.rs:514:17:514:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:519:9:519:9 | m | main.rs:495:5:517:5 | mod m | +| main.rs:519:9:519:12 | ...::X | main.rs:504:9:504:21 | struct X | +| main.rs:522:17:522:17 | X | main.rs:504:9:504:21 | struct X | +| main.rs:525:17:525:17 | m | main.rs:495:5:517:5 | mod m | +| main.rs:525:17:525:22 | ...::Foo | main.rs:496:9:498:9 | trait Foo | +| main.rs:526:13:526:13 | X | main.rs:504:9:504:21 | struct X | +| main.rs:526:13:526:23 | ...::a_method | main.rs:506:26:509:13 | fn a_method | +| main.rs:530:17:530:17 | m | main.rs:495:5:517:5 | mod m | +| main.rs:530:17:530:22 | ...::Bar | main.rs:500:9:502:9 | trait Bar | +| main.rs:531:13:531:13 | X | main.rs:504:9:504:21 | struct X | +| main.rs:531:13:531:23 | ...::a_method | main.rs:512:26:515:13 | fn a_method | +| main.rs:535:17:535:17 | m | main.rs:495:5:517:5 | mod m | +| main.rs:535:17:535:22 | ...::Bar | main.rs:500:9:502:9 | trait Bar | +| main.rs:536:13:536:13 | X | main.rs:504:9:504:21 | struct X | +| main.rs:536:13:536:23 | ...::a_method | main.rs:512:26:515:13 | fn a_method | +| main.rs:541:13:541:13 | m | main.rs:495:5:517:5 | mod m | +| main.rs:541:13:541:18 | ...::Bar | main.rs:500:9:502:9 | trait Bar | +| main.rs:541:13:541:28 | ...::a_method | main.rs:501:13:501:31 | fn a_method | +| main.rs:554:10:554:16 | MyTrait | main.rs:547:5:549:5 | trait MyTrait | +| main.rs:555:9:555:9 | S | main.rs:551:5:551:13 | struct S | +| main.rs:557:13:557:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:563:7:563:13 | MyTrait | main.rs:547:5:549:5 | trait MyTrait | +| main.rs:564:10:564:10 | T | main.rs:562:10:562:10 | T | +| main.rs:566:9:566:9 | T | main.rs:562:10:562:10 | T | +| main.rs:566:9:566:12 | ...::f | main.rs:548:9:548:20 | fn f | +| main.rs:567:9:567:15 | MyTrait | main.rs:547:5:549:5 | trait MyTrait | +| main.rs:567:9:567:18 | ...::f | main.rs:548:9:548:20 | fn f | +| main.rs:572:9:572:9 | g | main.rs:561:5:568:5 | fn g | +| main.rs:573:11:573:11 | S | main.rs:551:5:551:13 | struct S | +| main.rs:580:9:580:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:585:13:585:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:590:17:590:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:591:17:591:21 | super | main.rs:583:5:595:5 | mod m19 | +| main.rs:591:17:591:24 | ...::f | main.rs:584:9:586:9 | fn f | +| main.rs:592:17:592:21 | super | main.rs:583:5:595:5 | mod m19 | +| main.rs:592:17:592:28 | ...::super | main.rs:578:1:596:1 | mod m18 | +| main.rs:592:17:592:31 | ...::f | main.rs:579:5:581:5 | fn f | +| main.rs:609:13:609:17 | super | main.rs:598:1:623:1 | mod m21 | +| main.rs:609:13:609:22 | ...::m22 | main.rs:599:5:605:5 | mod m22 | +| main.rs:609:13:609:30 | ...::MyEnum | main.rs:600:9:602:9 | enum MyEnum | +| main.rs:610:13:610:16 | self | main.rs:600:9:602:9 | enum MyEnum | +| main.rs:614:13:614:17 | super | main.rs:598:1:623:1 | mod m21 | +| main.rs:614:13:614:22 | ...::m22 | main.rs:599:5:605:5 | mod m22 | +| main.rs:614:13:614:32 | ...::MyStruct | main.rs:604:9:604:28 | struct MyStruct | +| main.rs:615:13:615:16 | self | main.rs:604:9:604:28 | struct MyStruct | +| main.rs:619:21:619:26 | MyEnum | main.rs:600:9:602:9 | enum MyEnum | +| main.rs:619:21:619:29 | ...::A | main.rs:601:13:601:13 | A | +| main.rs:620:21:620:28 | MyStruct | main.rs:604:9:604:28 | struct MyStruct | +| main.rs:636:10:638:5 | Trait1::<...> | main.rs:626:5:631:5 | trait Trait1 | +| main.rs:637:7:637:10 | Self | main.rs:633:5:633:13 | struct S | +| main.rs:639:11:639:11 | S | main.rs:633:5:633:13 | struct S | +| main.rs:641:13:641:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:647:17:647:17 | S | main.rs:633:5:633:13 | struct S | +| main.rs:663:15:663:15 | T | main.rs:662:26:662:26 | T | +| main.rs:668:9:668:24 | GenericStruct::<...> | main.rs:661:5:664:5 | struct GenericStruct | +| main.rs:668:23:668:23 | T | main.rs:667:10:667:10 | T | +| main.rs:670:9:670:9 | T | main.rs:667:10:667:10 | T | +| main.rs:670:12:670:17 | TraitA | main.rs:653:5:655:5 | trait TraitA | +| main.rs:679:9:679:24 | GenericStruct::<...> | main.rs:661:5:664:5 | struct GenericStruct | +| main.rs:679:23:679:23 | T | main.rs:678:10:678:10 | T | +| main.rs:681:9:681:9 | T | main.rs:678:10:678:10 | T | +| main.rs:681:12:681:17 | TraitB | main.rs:657:5:659:5 | trait TraitB | +| main.rs:682:9:682:9 | T | main.rs:678:10:678:10 | T | +| main.rs:682:12:682:17 | TraitA | main.rs:653:5:655:5 | trait TraitA | +| main.rs:693:10:693:15 | TraitA | main.rs:653:5:655:5 | trait TraitA | +| main.rs:693:21:693:31 | Implementor | main.rs:690:5:690:23 | struct Implementor | +| main.rs:695:13:695:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:700:10:700:15 | TraitB | main.rs:657:5:659:5 | trait TraitB | +| main.rs:700:21:700:31 | Implementor | main.rs:690:5:690:23 | struct Implementor | +| main.rs:702:13:702:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:708:24:708:34 | Implementor | main.rs:690:5:690:23 | struct Implementor | +| main.rs:709:23:709:35 | GenericStruct | main.rs:661:5:664:5 | struct GenericStruct | +| main.rs:715:9:715:36 | GenericStruct::<...> | main.rs:661:5:664:5 | struct GenericStruct | +| main.rs:715:9:715:50 | ...::call_trait_a | main.rs:672:9:674:9 | fn call_trait_a | +| main.rs:715:25:715:35 | Implementor | main.rs:690:5:690:23 | struct Implementor | +| main.rs:718:9:718:36 | GenericStruct::<...> | main.rs:661:5:664:5 | struct GenericStruct | +| main.rs:718:9:718:47 | ...::call_both | main.rs:684:9:687:9 | fn call_both | +| main.rs:718:25:718:35 | Implementor | main.rs:690:5:690:23 | struct Implementor | +| main.rs:724:3:724:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:724:3:724:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:728:6:728:12 | AStruct | main.rs:727:1:727:17 | struct AStruct | +| main.rs:730:7:730:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:730:7:730:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:733:7:733:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:733:7:733:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:738:9:738:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:738:9:738:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | +| main.rs:738:9:738:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:739:9:739:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:739:9:739:19 | ...::result | {EXTERNAL LOCATION} | mod result | +| main.rs:739:9:739:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | +| main.rs:747:19:747:22 | Self | main.rs:741:5:749:5 | trait Reduce | +| main.rs:747:19:747:29 | ...::Input | main.rs:742:9:742:19 | type Input | +| main.rs:748:14:748:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:748:21:748:24 | Self | main.rs:741:5:749:5 | trait Reduce | +| main.rs:748:21:748:32 | ...::Output | main.rs:743:21:744:20 | type Output | +| main.rs:748:35:748:38 | Self | main.rs:741:5:749:5 | trait Reduce | +| main.rs:748:35:748:45 | ...::Error | main.rs:742:21:743:19 | type Error | +| main.rs:752:17:752:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:752:29:752:33 | Input | main.rs:751:19:751:23 | Input | +| main.rs:753:17:753:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:753:29:753:33 | Error | main.rs:751:26:751:30 | Error | +| main.rs:760:11:760:16 | Reduce | main.rs:741:5:749:5 | trait Reduce | +| main.rs:761:13:764:9 | MyImpl::<...> | main.rs:751:5:754:5 | struct MyImpl | +| main.rs:762:13:762:17 | Input | main.rs:758:13:758:17 | Input | +| main.rs:763:13:763:17 | Error | main.rs:759:13:759:17 | Error | +| main.rs:766:22:769:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:767:13:767:17 | Input | main.rs:758:13:758:17 | Input | +| main.rs:768:13:768:16 | Self | main.rs:756:5:788:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:768:13:768:23 | ...::Error | main.rs:770:11:774:9 | type Error | +| main.rs:771:22:773:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:772:11:772:15 | Error | main.rs:759:13:759:17 | Error | +| main.rs:776:13:776:17 | Input | main.rs:758:13:758:17 | Input | +| main.rs:781:19:781:22 | Self | main.rs:756:5:788:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:781:19:781:29 | ...::Input | main.rs:766:9:770:9 | type Input | +| main.rs:782:14:785:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:783:13:783:16 | Self | main.rs:756:5:788:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:783:13:783:24 | ...::Output | main.rs:774:11:777:9 | type Output | +| main.rs:784:13:784:16 | Self | main.rs:756:5:788:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:784:13:784:23 | ...::Error | main.rs:770:11:774:9 | type Error | +| main.rs:791:5:791:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:791:11:791:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:793:15:793:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:793:15:793:25 | ...::string | {EXTERNAL LOCATION} | mod string | +| main.rs:793:15:793:33 | ...::String | {EXTERNAL LOCATION} | struct String | +| main.rs:803:7:803:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:803:7:803:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | +| main.rs:804:10:804:15 | ATrait | main.rs:799:5:801:5 | trait ATrait | +| main.rs:804:21:804:23 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:806:11:806:13 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:812:17:812:19 | Foo | main.rs:797:5:797:15 | struct Foo | +| main.rs:818:22:818:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:818:29:818:31 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:819:17:819:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:820:17:820:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:820:24:820:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:821:13:821:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:822:17:822:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:824:13:824:16 | None | {EXTERNAL LOCATION} | None | +| main.rs:825:17:825:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:834:19:834:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:834:26:834:28 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:835:26:835:29 | test | main.rs:817:5:831:5 | fn test | +| main.rs:841:14:841:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:846:17:846:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:848:13:848:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:853:13:853:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:853:18:853:18 | z | main.rs:840:5:842:12 | Const | +| main.rs:853:24:853:24 | z | main.rs:840:5:842:12 | Const | +| main.rs:860:5:860:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:860:5:860:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:860:5:860:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:860:5:860:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:860:5:860:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:861:5:861:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:861:5:861:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:862:5:862:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:862:5:862:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:862:5:862:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:862:5:862:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:863:5:863:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:864:5:864:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:865:5:865:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:865:5:865:12 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:866:5:866:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:866:5:866:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:866:5:866:13 | ...::g | main.rs:30:9:34:9 | fn g | +| main.rs:867:5:867:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:867:5:867:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:867:5:867:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | +| main.rs:867:5:867:17 | ...::h | main.rs:37:27:41:13 | fn h | +| main.rs:868:5:868:6 | m4 | main.rs:46:1:53:1 | mod m4 | +| main.rs:868:5:868:9 | ...::i | main.rs:49:5:52:5 | fn i | +| main.rs:869:5:869:5 | h | main.rs:57:1:76:1 | fn h | +| main.rs:870:5:870:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:871:5:871:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:872:5:872:5 | j | main.rs:104:1:108:1 | fn j | +| main.rs:873:5:873:6 | m6 | main.rs:116:1:128:1 | mod m6 | +| main.rs:873:5:873:9 | ...::g | main.rs:121:5:127:5 | fn g | +| main.rs:874:5:874:6 | m7 | main.rs:130:1:149:1 | mod m7 | +| main.rs:874:5:874:9 | ...::f | main.rs:141:5:148:5 | fn f | +| main.rs:875:5:875:6 | m8 | main.rs:151:1:205:1 | mod m8 | +| main.rs:875:5:875:9 | ...::g | main.rs:189:5:204:5 | fn g | +| main.rs:876:5:876:6 | m9 | main.rs:207:1:215:1 | mod m9 | +| main.rs:876:5:876:9 | ...::f | main.rs:210:5:214:5 | fn f | +| main.rs:877:5:877:7 | m11 | main.rs:238:1:275:1 | mod m11 | +| main.rs:877:5:877:10 | ...::f | main.rs:243:5:246:5 | fn f | +| main.rs:878:5:878:7 | m15 | main.rs:306:1:375:1 | mod m15 | +| main.rs:878:5:878:10 | ...::f | main.rs:362:5:374:5 | fn f | +| main.rs:879:5:879:7 | m16 | main.rs:377:1:492:1 | mod m16 | +| main.rs:879:5:879:10 | ...::f | main.rs:446:5:470:5 | fn f | +| main.rs:880:5:880:20 | trait_visibility | main.rs:494:1:544:1 | mod trait_visibility | +| main.rs:880:5:880:23 | ...::f | main.rs:521:5:543:5 | fn f | +| main.rs:881:5:881:7 | m17 | main.rs:546:1:576:1 | mod m17 | +| main.rs:881:5:881:10 | ...::f | main.rs:570:5:575:5 | fn f | +| main.rs:882:5:882:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:882:5:882:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:883:5:883:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:883:5:883:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:884:5:884:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | +| main.rs:884:5:884:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:885:5:885:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:886:5:886:12 | my_alias | main.rs:1:1:1:7 | mod my | +| main.rs:886:5:886:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:887:5:887:7 | m18 | main.rs:578:1:596:1 | mod m18 | +| main.rs:887:5:887:12 | ...::m19 | main.rs:583:5:595:5 | mod m19 | +| main.rs:887:5:887:17 | ...::m20 | main.rs:588:9:594:9 | mod m20 | +| main.rs:887:5:887:20 | ...::g | main.rs:589:13:593:13 | fn g | +| main.rs:888:5:888:7 | m23 | main.rs:625:1:650:1 | mod m23 | +| main.rs:888:5:888:10 | ...::f | main.rs:645:5:649:5 | fn f | +| main.rs:889:5:889:7 | m24 | main.rs:652:1:720:1 | mod m24 | +| main.rs:889:5:889:10 | ...::f | main.rs:706:5:719:5 | fn f | +| main.rs:890:5:890:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:890:5:890:11 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:891:5:891:13 | z_changed | main.rs:725:1:725:9 | fn z_changed | +| main.rs:892:5:892:11 | AStruct | main.rs:727:1:727:17 | struct AStruct | +| main.rs:892:5:892:22 | ...::z_on_type | main.rs:731:5:731:17 | fn z_on_type | +| main.rs:893:5:893:11 | AStruct | main.rs:727:1:727:17 | struct AStruct | +| main.rs:894:5:894:29 | impl_with_attribute_macro | main.rs:795:1:814:1 | mod impl_with_attribute_macro | +| main.rs:894:5:894:35 | ...::test | main.rs:810:5:813:5 | fn test | +| main.rs:895:5:895:12 | patterns | main.rs:816:1:857:1 | mod patterns | +| main.rs:895:5:895:18 | ...::test | main.rs:817:5:831:5 | fn test | | my2/mod.rs:4:5:4:11 | println | {EXTERNAL LOCATION} | MacroRules | | 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 | @@ -514,7 +524,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:57:1:76:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:873:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:896:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:57:1:76:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | From 551e7ada5c0e81e701a821719d22cd7b1d2a3eec Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 12 Nov 2025 13:40:54 +0100 Subject: [PATCH 2/8] Rust: Refine `Self` resolution inside `impl` blocks --- .../codeql/rust/internal/PathResolution.qll | 32 +++++++++++-------- rust/ql/lib/codeql/rust/internal/Type.qll | 14 ++++++++ .../internal/TypeInferenceConsistency.qll | 9 +++++- .../lib/codeql/rust/internal/TypeMention.qll | 22 ++++++++++--- .../PathResolutionConsistency.expected | 1 - .../library-tests/path-resolution/main.rs | 8 ++--- .../path-resolution/path-resolution.expected | 27 ++++++++-------- .../PathResolutionConsistency.expected | 2 -- .../PathResolutionConsistency.expected | 5 ++- .../test/library-tests/type-inference/main.rs | 2 +- .../type-inference/type-inference.expected | 27 ---------------- 11 files changed, 81 insertions(+), 68 deletions(-) delete mode 100644 rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index d754258f16d0..b5c9025c8480 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -264,6 +264,9 @@ abstract class ItemNode extends Locatable { pragma[nomagic] ItemNode getImmediateParent() { this = result.getADescendant() } + /** Gets a child item of this item, if any. */ + ItemNode getAChild() { this = result.getImmediateParent() } + /** Gets the immediately enclosing module (or source file) of this item. */ pragma[nomagic] ModuleLikeNode getImmediateParentModule() { @@ -339,10 +342,13 @@ abstract class ItemNode extends Locatable { typeImplEdge(this, _, name, kind, result, useOpt) or // trait items with default implementations made available in an implementation - exists(ImplItemNodeImpl impl, ItemNode trait | + exists(ImplItemNodeImpl impl, TraitItemNode trait | this = impl and trait = impl.resolveTraitTyCand() and result = trait.getASuccessor(name, kind, useOpt) and + // do not inherit default implementations from super traits; those are inherited by + // their `impl` blocks + result = trait.getAssocItem(name) and result.(AssocItemNode).hasImplementation() and kind.isExternalOrBoth() and not impl.hasAssocItem(name) @@ -402,8 +408,14 @@ abstract class ItemNode extends Locatable { this instanceof SourceFile and builtin(name, result) or - name = "Self" and - this = result.(ImplOrTraitItemNode).getAnItemInSelfScope() + exists(ImplOrTraitItemNode i | + name = "Self" and + this = i.getAnItemInSelfScope() + | + result = i.(Trait) + or + result = i.(ImplItemNodeImpl).resolveSelfTyCand() + ) or name = "crate" and this = result.(CrateItemNode).getASourceFile() @@ -734,7 +746,7 @@ abstract class ImplOrTraitItemNode extends ItemNode { Path getASelfPath() { Stages::PathResolutionStage::ref() and isUnqualifiedSelfPath(result) and - this = unqualifiedPathLookup(result, _, _) + result = this.getAnItemInSelfScope().getADescendant() } /** Gets an associated item belonging to this trait or `impl` block. */ @@ -960,7 +972,7 @@ private class ImplItemNodeImpl extends ImplItemNode { result = this.resolveSelfTyBuiltin() } - TraitItemNode resolveTraitTyCand() { result = resolvePathCand(this.getTraitPath()) } + TraitItemNodeImpl resolveTraitTyCand() { result = resolvePathCand(this.getTraitPath()) } } private class StructItemNode extends TypeItemNode, ParameterizableItemNode instanceof Struct { @@ -1813,15 +1825,7 @@ private module DollarCrateResolution { pragma[nomagic] private ItemNode resolvePathCand0(PathExt path, Namespace ns) { - exists(ItemNode res | - res = unqualifiedPathLookup(path, ns, _) and - if - not any(PathExt parent).getQualifier() = path and - isUnqualifiedSelfPath(path) and - res instanceof ImplItemNode - then result = res.(ImplItemNodeImpl).resolveSelfTyCand() - else result = res - ) + result = unqualifiedPathLookup(path, ns, _) or DollarCrateResolution::resolveDollarCrate(path, result) and ns = result.getNamespace() diff --git a/rust/ql/lib/codeql/rust/internal/Type.qll b/rust/ql/lib/codeql/rust/internal/Type.qll index ccf5c7543639..4d10027b4acf 100644 --- a/rust/ql/lib/codeql/rust/internal/Type.qll +++ b/rust/ql/lib/codeql/rust/internal/Type.qll @@ -382,6 +382,8 @@ TypeParamTypeParameter getPtrTypeParameter() { /** A type parameter. */ abstract class TypeParameter extends Type { override TypeParameter getPositionalTypeParameter(int i) { none() } + + abstract ItemNode getDeclaringItem(); } private class RawTypeParameter = @type_param or @trait or @type_alias or @impl_trait_type_repr; @@ -400,6 +402,8 @@ class TypeParamTypeParameter extends TypeParameter, TTypeParamTypeParameter { TypeParam getTypeParam() { result = typeParam } + override ItemNode getDeclaringItem() { result.getTypeParam(_) = typeParam } + override string toString() { result = typeParam.toString() } override Location getLocation() { result = typeParam.getLocation() } @@ -433,6 +437,8 @@ class AssociatedTypeTypeParameter extends TypeParameter, TAssociatedTypeTypePara /** Gets the trait that contains this associated type declaration. */ TraitItemNode getTrait() { result.getAnAssocItem() = typeAlias } + override ItemNode getDeclaringItem() { result = this.getTrait() } + override string toString() { result = typeAlias.getName().getText() } override Location getLocation() { result = typeAlias.getLocation() } @@ -465,6 +471,8 @@ class DynTraitTypeParameter extends TypeParameter, TDynTraitTypeParameter { result = [this.getTypeParam().toString(), this.getTypeAlias().getName().toString()] } + override ItemNode getDeclaringItem() { none() } + override string toString() { result = "dyn(" + this.toStringInner() + ")" } override Location getLocation() { result = n.getLocation() } @@ -480,6 +488,8 @@ class ImplTraitTypeParameter extends TypeParameter, TImplTraitTypeParameter { ImplTraitTypeRepr getImplTraitTypeRepr() { result = implTrait } + override ItemNode getDeclaringItem() { none() } + override string toString() { result = "impl(" + typeParam.toString() + ")" } override Location getLocation() { result = typeParam.getLocation() } @@ -499,6 +509,8 @@ class SelfTypeParameter extends TypeParameter, TSelfTypeParameter { Trait getTrait() { result = trait } + override ItemNode getDeclaringItem() { result = trait } + override string toString() { result = "Self [" + trait.toString() + "]" } override Location getLocation() { result = trait.getLocation() } @@ -526,6 +538,8 @@ class ImplTraitTypeTypeParameter extends ImplTraitType, TypeParameter { ImplTraitTypeTypeParameter() { impl = function.getAParam().getTypeRepr() } + override ItemNode getDeclaringItem() { none() } + override Function getFunction() { result = function } override TypeParameter getPositionalTypeParameter(int i) { none() } diff --git a/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll b/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll index 16eaff92bb6c..11ad9bef2a21 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll @@ -11,7 +11,14 @@ import TypeInference::Consistency query predicate illFormedTypeMention(TypeMention tm) { Consistency::illFormedTypeMention(tm) and - not tm instanceof PathTypeReprMention and // avoid overlap with `PathTypeMention` + // avoid overlap with `PathTypeMention` + not tm instanceof PathTypeReprMention and + // known limitation for type mentions that would mention an escaping type parameter + not tm = + any(PathTypeMention ptm | + exists(ptm.resolvePathTypeAt(TypePath::nil())) and + not exists(ptm.resolveType()) + ) and // Only include inconsistencies in the source, as we otherwise get // inconsistencies from library code in every project. tm.fromSource() diff --git a/rust/ql/lib/codeql/rust/internal/TypeMention.qll b/rust/ql/lib/codeql/rust/internal/TypeMention.qll index 90de48035e38..a88f3e20a964 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeMention.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeMention.qll @@ -77,7 +77,19 @@ class SliceTypeReprMention extends TypeMention instanceof SliceTypeRepr { } } -abstract class PathTypeMention extends TypeMention, Path { } +abstract class PathTypeMention extends TypeMention, Path { + abstract Type resolvePathTypeAt(TypePath typePath); + + final override Type resolveTypeAt(TypePath typePath) { + result = this.resolvePathTypeAt(typePath) and + ( + not result instanceof TypeParameter + or + // Prevent type parameters from escaping their scope + this = result.(TypeParameter).getDeclaringItem().getAChild*().getADescendant() + ) + } +} class AliasPathTypeMention extends PathTypeMention { TypeAlias resolved; @@ -94,7 +106,7 @@ class AliasPathTypeMention extends PathTypeMention { * Holds if this path resolved to a type alias with a rhs. that has the * resulting type at `typePath`. */ - override Type resolveTypeAt(TypePath typePath) { + override Type resolvePathTypeAt(TypePath typePath) { result = rhs.resolveTypeAt(typePath) and not result = pathGetTypeParameter(resolved, _) or @@ -275,7 +287,7 @@ class NonAliasPathTypeMention extends PathTypeMention { result = TAssociatedTypeTypeParameter(resolved) } - override Type resolveTypeAt(TypePath typePath) { + override Type resolvePathTypeAt(TypePath typePath) { typePath.isEmpty() and result = this.resolveRootType() or @@ -307,7 +319,9 @@ class ImplSelfMention extends PathTypeMention { ImplSelfMention() { this = impl.getASelfPath() } - override Type resolveTypeAt(TypePath typePath) { result = resolveImplSelfTypeAt(impl, typePath) } + override Type resolvePathTypeAt(TypePath typePath) { + result = resolveImplSelfTypeAt(impl, typePath) + } } class PathTypeReprMention extends TypeMention, PathTypeRepr { diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 6291f1de06d7..10da6bb9c375 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -4,4 +4,3 @@ multipleCallTargets | main.rs:369:9:371:16 | ...::f(...) | | main.rs:450:9:454:16 | ...::f(...) | | main.rs:455:9:459:16 | ...::f(...) | -| main.rs:460:9:460:16 | ...::g(...) | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 47a8dddeab84..d576a7205f52 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -437,9 +437,9 @@ mod m16 { > // $ item=I89 for S { // $ item=I90 fn f(&self) -> S { // $ item=I90 - Self::g(&self); // $ MISSING: item=I92 $ SPURIOUS: item=I85 + Self::g(&self); // $ item=I92 println!("m16::>::f"); // $ item=println - Self::c // $ MISSING: item=I95 + Self::c // $ item=I95 } // I93 } @@ -457,7 +457,7 @@ mod m16 { S // $ item=I90 > // $ item=I89 >::f(&x); // $ MISSING: item=I93 - S::g(&x); // $ item=I92 $ SPURIOUS: item=I85 + S::g(&x); // $ item=I92 x.g(); // $ item=I92 S::h(&x); // $ item=I96 x.h(); // $ item=I96 @@ -485,7 +485,7 @@ mod m16 { impl Trait4 for S2 { // $ item=Trait4 item=S2 fn g(&self) { - Self::f(&self); // $ MISSING: item=S2asTrait3::f + Self::f(&self); // $ item=S2asTrait3::f S2::f(&self); // $ item=S2asTrait3::f } } 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 1a904ce55418..f18aab5af516 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -133,7 +133,7 @@ resolvePath | main.rs:169:22:169:29 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | | main.rs:171:13:171:19 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:172:13:172:13 | f | main.rs:164:5:166:5 | fn f | -| main.rs:173:13:173:16 | Self | main.rs:168:5:179:5 | impl MyTrait for MyStruct { ... } | +| main.rs:173:13:173:16 | Self | main.rs:162:5:162:22 | struct MyStruct | | main.rs:173:13:173:19 | ...::g | main.rs:176:9:178:9 | fn g | | main.rs:177:13:177:19 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:182:10:182:17 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | @@ -197,7 +197,7 @@ resolvePath | main.rs:341:10:341:15 | Trait1 | main.rs:307:5:311:5 | trait Trait1 | | main.rs:342:11:342:11 | S | main.rs:338:5:338:13 | struct S | | main.rs:344:13:344:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:345:13:345:16 | Self | main.rs:340:5:352:5 | impl Trait1 for S { ... } | +| main.rs:345:13:345:16 | Self | main.rs:338:5:338:13 | struct S | | main.rs:345:13:345:19 | ...::g | main.rs:349:9:351:9 | fn g | | main.rs:350:13:350:19 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:355:10:355:15 | Trait2 | main.rs:313:5:321:5 | trait Trait2 | @@ -230,11 +230,11 @@ resolvePath | main.rs:418:11:418:11 | S | main.rs:412:5:412:13 | struct S | | main.rs:419:24:419:24 | S | main.rs:412:5:412:13 | struct S | | main.rs:420:13:420:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:421:13:421:16 | Self | main.rs:414:5:432:5 | impl Trait1::<...> for S { ... } | +| main.rs:421:13:421:16 | Self | main.rs:412:5:412:13 | struct S | | main.rs:421:13:421:19 | ...::g | main.rs:425:9:428:9 | fn g | | main.rs:425:24:425:24 | S | main.rs:412:5:412:13 | struct S | | main.rs:426:13:426:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:427:13:427:16 | Self | main.rs:414:5:432:5 | impl Trait1::<...> for S { ... } | +| main.rs:427:13:427:16 | Self | main.rs:412:5:412:13 | struct S | | main.rs:427:13:427:19 | ...::c | main.rs:430:9:431:9 | Const | | main.rs:430:18:430:18 | S | main.rs:412:5:412:13 | struct S | | main.rs:430:22:430:22 | S | main.rs:412:5:412:13 | struct S | @@ -242,10 +242,11 @@ resolvePath | main.rs:436:7:436:7 | S | main.rs:412:5:412:13 | struct S | | main.rs:438:11:438:11 | S | main.rs:412:5:412:13 | struct S | | main.rs:439:24:439:24 | S | main.rs:412:5:412:13 | struct S | -| main.rs:440:13:440:16 | Self | main.rs:434:5:444:5 | impl Trait2::<...> for S { ... } | -| main.rs:440:13:440:19 | ...::g | main.rs:384:9:386:9 | fn g | +| main.rs:440:13:440:16 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:440:13:440:19 | ...::g | main.rs:425:9:428:9 | fn g | | main.rs:441:13:441:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:442:13:442:16 | Self | main.rs:434:5:444:5 | impl Trait2::<...> for S { ... } | +| main.rs:442:13:442:16 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:442:13:442:19 | ...::c | main.rs:430:9:431:9 | Const | | main.rs:448:9:448:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:449:17:449:17 | S | main.rs:412:5:412:13 | struct S | | main.rs:450:10:450:10 | S | main.rs:412:5:412:13 | struct S | @@ -255,7 +256,6 @@ resolvePath | main.rs:456:14:458:11 | Trait2::<...> | main.rs:397:5:410:5 | trait Trait2 | | main.rs:457:13:457:13 | S | main.rs:412:5:412:13 | struct S | | main.rs:460:9:460:9 | S | main.rs:412:5:412:13 | struct S | -| main.rs:460:9:460:12 | ...::g | main.rs:384:9:386:9 | fn g | | main.rs:460:9:460:12 | ...::g | main.rs:425:9:428:9 | fn g | | main.rs:462:9:462:9 | S | main.rs:412:5:412:13 | struct S | | main.rs:462:9:462:12 | ...::h | main.rs:388:9:391:9 | fn h | @@ -268,7 +268,8 @@ resolvePath | main.rs:482:21:482:22 | S2 | main.rs:480:5:480:14 | struct S2 | | main.rs:486:10:486:15 | Trait4 | main.rs:476:5:478:5 | trait Trait4 | | main.rs:486:21:486:22 | S2 | main.rs:480:5:480:14 | struct S2 | -| main.rs:488:13:488:16 | Self | main.rs:486:5:491:5 | impl Trait4 for S2 { ... } | +| main.rs:488:13:488:16 | Self | main.rs:480:5:480:14 | struct S2 | +| main.rs:488:13:488:19 | ...::f | main.rs:482:26:483:23 | fn f | | main.rs:489:13:489:14 | S2 | main.rs:480:5:480:14 | struct S2 | | main.rs:489:13:489:17 | ...::f | main.rs:482:26:483:23 | fn f | | main.rs:506:14:506:16 | Foo | main.rs:496:9:498:9 | trait Foo | @@ -385,17 +386,17 @@ resolvePath | main.rs:763:13:763:17 | Error | main.rs:759:13:759:17 | Error | | main.rs:766:22:769:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | | main.rs:767:13:767:17 | Input | main.rs:758:13:758:17 | Input | -| main.rs:768:13:768:16 | Self | main.rs:756:5:788:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:768:13:768:16 | Self | main.rs:751:5:754:5 | struct MyImpl | | main.rs:768:13:768:23 | ...::Error | main.rs:770:11:774:9 | type Error | | main.rs:771:22:773:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | | main.rs:772:11:772:15 | Error | main.rs:759:13:759:17 | Error | | main.rs:776:13:776:17 | Input | main.rs:758:13:758:17 | Input | -| main.rs:781:19:781:22 | Self | main.rs:756:5:788:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:781:19:781:22 | Self | main.rs:751:5:754:5 | struct MyImpl | | main.rs:781:19:781:29 | ...::Input | main.rs:766:9:770:9 | type Input | | main.rs:782:14:785:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:783:13:783:16 | Self | main.rs:756:5:788:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:783:13:783:16 | Self | main.rs:751:5:754:5 | struct MyImpl | | main.rs:783:13:783:24 | ...::Output | main.rs:774:11:777:9 | type Output | -| main.rs:784:13:784:16 | Self | main.rs:756:5:788:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:784:13:784:16 | Self | main.rs:751:5:754:5 | struct MyImpl | | main.rs:784:13:784:23 | ...::Error | main.rs:770:11:774:9 | type Error | | main.rs:791:5:791:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | | main.rs:791:11:791:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | diff --git a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index ce79c75327ab..000000000000 --- a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| test.rs:288:7:288:36 | ... .as_str() | diff --git a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected index 7ee176a136f8..e78621bebd5b 100644 --- a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected @@ -5,10 +5,13 @@ multipleCallTargets | dereference.rs:184:17:184:30 | ... .foo() | | dereference.rs:186:17:186:25 | S.bar(...) | | dereference.rs:187:17:187:29 | S.bar(...) | -| main.rs:590:9:590:18 | ...::m(...) | | main.rs:2634:13:2634:31 | ...::from(...) | | main.rs:2635:13:2635:31 | ...::from(...) | | main.rs:2636:13:2636:31 | ...::from(...) | | main.rs:2642:13:2642:31 | ...::from(...) | | main.rs:2643:13:2643:31 | ...::from(...) | | main.rs:2644:13:2644:31 | ...::from(...) | +multiplePathResolutions +| main.rs:2463:41:2463:52 | ...::Output | +| main.rs:2472:38:2472:49 | ...::Output | +| main.rs:2484:42:2484:53 | ...::Output | diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index bf53c4906e30..f78202969b8a 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -587,7 +587,7 @@ mod impl_overlap { println!("{:?}", S3::m(&w, x)); // $ target=S3::m S4.m(); // $ target=::m - S4::m(&S4); // $ target=::m $ SPURIOUS: target=MyTrait1::m + S4::m(&S4); // $ target=::m S5(0i32).m(); // $ target=_as_MyTrait1>::m S5::m(&S5(0i32)); // $ target=_as_MyTrait1>::m S5(true).m(); // $ target=MyTrait1::m diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index a56b6b7c4754..c8557a59381d 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -2615,8 +2615,6 @@ inferType | main.rs:1025:18:1025:49 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1025:26:1025:27 | x3 | | main.rs:943:5:944:13 | S | | main.rs:1025:26:1025:40 | x3.putTwo(...) | | main.rs:892:5:895:5 | Wrapper | -| main.rs:1025:26:1025:40 | x3.putTwo(...) | A | main.rs:963:36:963:50 | AssociatedParam | -| main.rs:1025:26:1025:49 | ... .unwrap() | | main.rs:963:36:963:50 | AssociatedParam | | main.rs:1025:36:1025:36 | 2 | | {EXTERNAL LOCATION} | i32 | | main.rs:1025:39:1025:39 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:1027:20:1027:20 | S | | main.rs:943:5:944:13 | S | @@ -2658,17 +2656,13 @@ inferType | main.rs:1050:24:1050:28 | SelfParam | TRef | main.rs:1048:5:1051:5 | Self [trait Subtrait] | | main.rs:1059:23:1059:27 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1059:23:1059:27 | SelfParam | TRef | main.rs:1053:5:1063:5 | Self [trait Subtrait2] | -| main.rs:1059:30:1059:31 | c1 | | main.rs:1043:9:1043:21 | Content | -| main.rs:1059:49:1059:50 | c2 | | main.rs:1043:9:1043:21 | Content | | main.rs:1059:68:1062:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1060:13:1060:16 | self | | {EXTERNAL LOCATION} | & | | main.rs:1060:13:1060:16 | self | TRef | main.rs:1053:5:1063:5 | Self [trait Subtrait2] | | main.rs:1060:13:1060:27 | self.insert(...) | | {EXTERNAL LOCATION} | () | -| main.rs:1060:25:1060:26 | c1 | | main.rs:1043:9:1043:21 | Content | | main.rs:1061:13:1061:16 | self | | {EXTERNAL LOCATION} | & | | main.rs:1061:13:1061:16 | self | TRef | main.rs:1053:5:1063:5 | Self [trait Subtrait2] | | main.rs:1061:13:1061:27 | self.insert(...) | | {EXTERNAL LOCATION} | () | -| main.rs:1061:25:1061:26 | c2 | | main.rs:1043:9:1043:21 | Content | | main.rs:1069:19:1069:23 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1069:19:1069:23 | SelfParam | TRef | main.rs:1065:5:1065:24 | MyType | | main.rs:1069:19:1069:23 | SelfParam | TRef.T | main.rs:1067:10:1067:10 | T | @@ -2693,25 +2687,17 @@ inferType | main.rs:1077:15:1077:18 | self | TRef.T | main.rs:1074:10:1074:17 | T | | main.rs:1081:33:1081:36 | item | | {EXTERNAL LOCATION} | & | | main.rs:1081:33:1081:36 | item | TRef | main.rs:1081:20:1081:30 | T | -| main.rs:1081:57:1083:5 | { ... } | | main.rs:1043:9:1043:21 | Content | | main.rs:1082:9:1082:12 | item | | {EXTERNAL LOCATION} | & | | main.rs:1082:9:1082:12 | item | TRef | main.rs:1081:20:1081:30 | T | -| main.rs:1082:9:1082:26 | item.get_content() | | main.rs:1043:9:1043:21 | Content | | main.rs:1085:35:1085:38 | item | | {EXTERNAL LOCATION} | & | | main.rs:1085:35:1085:38 | item | TRef | main.rs:1085:21:1085:32 | T | -| main.rs:1085:45:1085:46 | c1 | | main.rs:1043:9:1043:21 | Content | -| main.rs:1085:61:1085:62 | c2 | | main.rs:1043:9:1043:21 | Content | -| main.rs:1085:77:1085:78 | c3 | | main.rs:1043:9:1043:21 | Content | | main.rs:1085:93:1088:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1086:9:1086:12 | item | | {EXTERNAL LOCATION} | & | | main.rs:1086:9:1086:12 | item | TRef | main.rs:1085:21:1085:32 | T | | main.rs:1086:9:1086:23 | item.insert(...) | | {EXTERNAL LOCATION} | () | -| main.rs:1086:21:1086:22 | c1 | | main.rs:1043:9:1043:21 | Content | | main.rs:1087:9:1087:12 | item | | {EXTERNAL LOCATION} | & | | main.rs:1087:9:1087:12 | item | TRef | main.rs:1085:21:1085:32 | T | | main.rs:1087:9:1087:31 | item.insert_two(...) | | {EXTERNAL LOCATION} | () | -| main.rs:1087:25:1087:26 | c2 | | main.rs:1043:9:1043:21 | Content | -| main.rs:1087:29:1087:30 | c3 | | main.rs:1043:9:1043:21 | Content | | main.rs:1090:15:1096:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1091:13:1091:17 | item1 | | main.rs:1065:5:1065:24 | MyType | | main.rs:1091:13:1091:17 | item1 | T | {EXTERNAL LOCATION} | i64 | @@ -3980,7 +3966,6 @@ inferType | main.rs:1762:17:1762:20 | self | TRef.TSlice | main.rs:1760:14:1760:23 | T | | main.rs:1762:17:1762:27 | self.get(...) | | {EXTERNAL LOCATION} | Option | | main.rs:1762:17:1762:27 | self.get(...) | T | {EXTERNAL LOCATION} | & | -| main.rs:1762:17:1762:27 | self.get(...) | T.TRef | main.rs:1760:14:1760:23 | T | | main.rs:1762:17:1762:36 | ... .unwrap() | | {EXTERNAL LOCATION} | & | | main.rs:1762:17:1762:36 | ... .unwrap() | TRef | main.rs:1760:14:1760:23 | T | | main.rs:1762:26:1762:26 | 0 | | {EXTERNAL LOCATION} | i32 | @@ -4626,9 +4611,7 @@ inferType | main.rs:2076:44:2076:50 | other.y | | {EXTERNAL LOCATION} | i64 | | main.rs:2080:26:2080:26 | a | | main.rs:2080:18:2080:23 | T | | main.rs:2080:32:2080:32 | b | | main.rs:2080:18:2080:23 | T | -| main.rs:2080:51:2082:5 | { ... } | | {EXTERNAL LOCATION} | Output | | main.rs:2081:9:2081:9 | a | | main.rs:2080:18:2080:23 | T | -| main.rs:2081:9:2081:13 | ... + ... | | {EXTERNAL LOCATION} | Output | | main.rs:2081:13:2081:13 | b | | main.rs:2080:18:2080:23 | T | | main.rs:2084:16:2215:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2088:13:2088:18 | i64_eq | | {EXTERNAL LOCATION} | bool | @@ -5138,9 +5121,7 @@ inferType | main.rs:2388:23:2388:23 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:2391:37:2391:37 | a | | main.rs:2391:20:2391:34 | T | | main.rs:2391:43:2391:43 | b | | {EXTERNAL LOCATION} | usize | -| main.rs:2394:5:2396:5 | { ... } | | {EXTERNAL LOCATION} | Output | | main.rs:2395:9:2395:9 | a | | main.rs:2391:20:2391:34 | T | -| main.rs:2395:9:2395:12 | a[b] | | {EXTERNAL LOCATION} | Output | | main.rs:2395:11:2395:11 | b | | {EXTERNAL LOCATION} | usize | | main.rs:2398:16:2409:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2399:17:2399:19 | vec | | main.rs:2363:5:2366:5 | MyVec | @@ -5219,9 +5200,7 @@ inferType | main.rs:2463:25:2463:29 | other | | main.rs:2457:5:2457:19 | S | | main.rs:2463:25:2463:29 | other | T | main.rs:2459:10:2459:17 | T | | main.rs:2463:54:2465:9 | { ... } | | main.rs:2457:5:2457:19 | S | -| main.rs:2463:54:2465:9 | { ... } | T | main.rs:2420:9:2420:20 | Output | | main.rs:2464:13:2464:39 | S(...) | | main.rs:2457:5:2457:19 | S | -| main.rs:2464:13:2464:39 | S(...) | T | main.rs:2420:9:2420:20 | Output | | main.rs:2464:15:2464:22 | (...) | | main.rs:2459:10:2459:17 | T | | main.rs:2464:16:2464:19 | self | | main.rs:2457:5:2457:19 | S | | main.rs:2464:16:2464:19 | self | T | main.rs:2459:10:2459:17 | T | @@ -5233,9 +5212,7 @@ inferType | main.rs:2472:19:2472:22 | SelfParam | T | main.rs:2468:10:2468:17 | T | | main.rs:2472:25:2472:29 | other | | main.rs:2468:10:2468:17 | T | | main.rs:2472:51:2474:9 | { ... } | | main.rs:2457:5:2457:19 | S | -| main.rs:2472:51:2474:9 | { ... } | T | main.rs:2420:9:2420:20 | Output | | main.rs:2473:13:2473:37 | S(...) | | main.rs:2457:5:2457:19 | S | -| main.rs:2473:13:2473:37 | S(...) | T | main.rs:2420:9:2420:20 | Output | | main.rs:2473:15:2473:22 | (...) | | main.rs:2468:10:2468:17 | T | | main.rs:2473:16:2473:19 | self | | main.rs:2457:5:2457:19 | S | | main.rs:2473:16:2473:19 | self | T | main.rs:2468:10:2468:17 | T | @@ -5481,7 +5458,6 @@ inferType | main.rs:2627:43:2627:47 | "baz" | | {EXTERNAL LOCATION} | & | | main.rs:2627:43:2627:47 | "baz" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2628:9:2628:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2628:13:2628:13 | s | | {EXTERNAL LOCATION} | Item | | main.rs:2628:13:2628:13 | s | | {EXTERNAL LOCATION} | & | | main.rs:2628:13:2628:13 | s | TRef | {EXTERNAL LOCATION} | & | | main.rs:2628:13:2628:13 | s | TRef.TRef | {EXTERNAL LOCATION} | str | @@ -5494,7 +5470,6 @@ inferType | main.rs:2628:19:2628:26 | strings1 | TArray.TRef | {EXTERNAL LOCATION} | str | | main.rs:2628:28:2628:29 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2629:9:2629:33 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2629:13:2629:13 | s | | {EXTERNAL LOCATION} | Item | | main.rs:2629:13:2629:13 | s | | {EXTERNAL LOCATION} | & | | main.rs:2629:13:2629:13 | s | TRef | {EXTERNAL LOCATION} | & | | main.rs:2629:13:2629:13 | s | TRef.TRef | {EXTERNAL LOCATION} | str | @@ -5549,7 +5524,6 @@ inferType | main.rs:2644:26:2644:30 | "baz" | | {EXTERNAL LOCATION} | & | | main.rs:2644:26:2644:30 | "baz" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2646:9:2646:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2646:13:2646:13 | s | | {EXTERNAL LOCATION} | Item | | main.rs:2646:13:2646:13 | s | | {EXTERNAL LOCATION} | & | | main.rs:2646:13:2646:13 | s | TRef | {EXTERNAL LOCATION} | String | | main.rs:2646:18:2646:25 | strings3 | | {EXTERNAL LOCATION} | & | @@ -5607,7 +5581,6 @@ inferType | main.rs:2661:13:2661:22 | range_full | | {EXTERNAL LOCATION} | RangeFull | | main.rs:2661:26:2661:27 | .. | | {EXTERNAL LOCATION} | RangeFull | | main.rs:2662:9:2662:51 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2662:13:2662:13 | i | | {EXTERNAL LOCATION} | Item | | main.rs:2662:18:2662:48 | &... | | {EXTERNAL LOCATION} | & | | main.rs:2662:19:2662:36 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2662:19:2662:36 | [...] | TArray | {EXTERNAL LOCATION} | i64 | From 0d46dc0461e8d3f01f0cc2222a9f1e5c1e931e36 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 26 Nov 2025 11:33:17 +0100 Subject: [PATCH 3/8] Rust: More path resolution tests --- .../PathResolutionConsistency.expected | 3 + .../library-tests/path-resolution/main.rs | 19 +- .../path-resolution/path-resolution.expected | 518 +++++++++--------- 3 files changed, 283 insertions(+), 257 deletions(-) diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 10da6bb9c375..2bab7ae6b92f 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -4,3 +4,6 @@ multipleCallTargets | main.rs:369:9:371:16 | ...::f(...) | | main.rs:450:9:454:16 | ...::f(...) | | main.rs:455:9:459:16 | ...::f(...) | +multiplePathResolutions +| main.rs:492:20:492:34 | ...::AssocType | +| main.rs:504:20:504:34 | ...::AssocType | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index d576a7205f52..255846216ddb 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -470,23 +470,38 @@ mod m16 { } // I83 trait Trait3 { + type AssocType; + fn f(&self); } trait Trait4 { + type AssocType; + fn g(&self); } struct S2; + #[rustfmt::skip] impl Trait3 for S2 { // $ item=Trait3 item=S2 - fn f(&self) { } // S2asTrait3::f + type AssocType = i32 // $ item=i32 + ; // S2Trait3AssocType + + fn f(&self) { + let x: Self::AssocType = 42; // $ item=S2Trait3AssocType $ SPURIOUS: item=S2Trait4AssocType + } // S2asTrait3::f } + #[rustfmt::skip] impl Trait4 for S2 { // $ item=Trait4 item=S2 + type AssocType = bool // $ item=bool + ; // S2Trait4AssocType + fn g(&self) { Self::f(&self); // $ item=S2asTrait3::f S2::f(&self); // $ item=S2asTrait3::f + let x: Self::AssocType = true; // $ item=S2Trait4AssocType $ SPURIOUS: item=S2Trait3AssocType } } } @@ -828,7 +843,7 @@ mod patterns { N0ne => // local variable N0ne } - } // patterns::test + } // patterns::test #[rustfmt::skip] fn test2() -> Option { // $ item=Option $ item=i32 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 f18aab5af516..b802dff6a3c4 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -18,21 +18,21 @@ mod | main.rs:291:1:304:1 | mod m13 | | main.rs:295:5:303:5 | mod m14 | | main.rs:306:1:375:1 | mod m15 | -| main.rs:377:1:492:1 | mod m16 | -| main.rs:494:1:544:1 | mod trait_visibility | -| main.rs:495:5:517:5 | mod m | -| main.rs:546:1:576:1 | mod m17 | -| main.rs:578:1:596:1 | mod m18 | -| main.rs:583:5:595:5 | mod m19 | -| main.rs:588:9:594:9 | mod m20 | -| main.rs:598:1:623:1 | mod m21 | -| main.rs:599:5:605:5 | mod m22 | -| main.rs:607:5:622:5 | mod m33 | -| main.rs:625:1:650:1 | mod m23 | -| main.rs:652:1:720:1 | mod m24 | -| main.rs:737:1:789:1 | mod associated_types | -| main.rs:795:1:814:1 | mod impl_with_attribute_macro | -| main.rs:816:1:857:1 | mod patterns | +| main.rs:377:1:507:1 | mod m16 | +| main.rs:509:1:559:1 | mod trait_visibility | +| main.rs:510:5:532:5 | mod m | +| main.rs:561:1:591:1 | mod m17 | +| main.rs:593:1:611:1 | mod m18 | +| main.rs:598:5:610:5 | mod m19 | +| main.rs:603:9:609:9 | mod m20 | +| main.rs:613:1:638:1 | mod m21 | +| main.rs:614:5:620:5 | mod m22 | +| main.rs:622:5:637:5 | mod m33 | +| main.rs:640:1:665:1 | mod m23 | +| main.rs:667:1:735:1 | mod m24 | +| main.rs:752:1:804:1 | mod associated_types | +| main.rs:810:1:829:1 | mod impl_with_attribute_macro | +| main.rs:831:1:872:1 | mod patterns | | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:20:1:20:12 | mod my3 | | my2/mod.rs:22:1:23:10 | mod mymod | @@ -73,7 +73,7 @@ resolvePath | main.rs:37:17:37:24 | ...::f | main.rs:26:9:28:9 | fn f | | main.rs:39:17:39:23 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:40:17:40:17 | f | main.rs:26:9:28:9 | fn f | -| main.rs:47:9:47:13 | super | main.rs:1:1:896:2 | SourceFile | +| main.rs:47:9:47:13 | super | main.rs:1:1:911:2 | SourceFile | | main.rs:47:9:47:17 | ...::m1 | main.rs:20:1:44:1 | mod m1 | | main.rs:47:9:47:21 | ...::m2 | main.rs:25:5:43:5 | mod m2 | | main.rs:47:9:47:24 | ...::g | main.rs:30:9:34:9 | fn g | @@ -88,7 +88,7 @@ resolvePath | main.rs:68:17:68:19 | Foo | main.rs:66:9:66:21 | struct Foo | | main.rs:71:13:71:15 | Foo | main.rs:60:5:60:17 | struct Foo | | main.rs:73:5:73:5 | f | main.rs:62:5:69:5 | fn f | -| main.rs:75:5:75:8 | self | main.rs:1:1:896:2 | SourceFile | +| main.rs:75:5:75:8 | self | main.rs:1:1:911:2 | SourceFile | | main.rs:75:5:75:11 | ...::i | main.rs:78:1:90:1 | fn i | | main.rs:79:5:79:11 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:81:13:81:15 | Foo | main.rs:55:1:55:13 | struct Foo | @@ -110,7 +110,7 @@ resolvePath | main.rs:112:9:112:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:118:9:118:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:122:9:122:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:125:13:125:17 | super | main.rs:1:1:896:2 | SourceFile | +| main.rs:125:13:125:17 | super | main.rs:1:1:911:2 | SourceFile | | main.rs:125:13:125:21 | ...::m5 | main.rs:110:1:114:1 | mod m5 | | main.rs:126:9:126:9 | f | main.rs:111:5:113:5 | fn f | | main.rs:126:9:126:9 | f | main.rs:117:5:119:5 | fn f | @@ -264,242 +264,250 @@ resolvePath | main.rs:465:10:465:10 | S | main.rs:412:5:412:13 | struct S | | main.rs:466:14:468:11 | Trait1::<...> | main.rs:378:5:395:5 | trait Trait1 | | main.rs:467:13:467:13 | S | main.rs:412:5:412:13 | struct S | -| main.rs:482:10:482:15 | Trait3 | main.rs:472:5:474:5 | trait Trait3 | -| main.rs:482:21:482:22 | S2 | main.rs:480:5:480:14 | struct S2 | -| main.rs:486:10:486:15 | Trait4 | main.rs:476:5:478:5 | trait Trait4 | -| main.rs:486:21:486:22 | S2 | main.rs:480:5:480:14 | struct S2 | -| main.rs:488:13:488:16 | Self | main.rs:480:5:480:14 | struct S2 | -| main.rs:488:13:488:19 | ...::f | main.rs:482:26:483:23 | fn f | -| main.rs:489:13:489:14 | S2 | main.rs:480:5:480:14 | struct S2 | -| main.rs:489:13:489:17 | ...::f | main.rs:482:26:483:23 | fn f | -| main.rs:506:14:506:16 | Foo | main.rs:496:9:498:9 | trait Foo | -| main.rs:506:22:506:22 | X | main.rs:504:9:504:21 | struct X | -| main.rs:508:17:508:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:512:14:512:16 | Bar | main.rs:500:9:502:9 | trait Bar | -| main.rs:512:22:512:22 | X | main.rs:504:9:504:21 | struct X | -| main.rs:514:17:514:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:519:9:519:9 | m | main.rs:495:5:517:5 | mod m | -| main.rs:519:9:519:12 | ...::X | main.rs:504:9:504:21 | struct X | -| main.rs:522:17:522:17 | X | main.rs:504:9:504:21 | struct X | -| main.rs:525:17:525:17 | m | main.rs:495:5:517:5 | mod m | -| main.rs:525:17:525:22 | ...::Foo | main.rs:496:9:498:9 | trait Foo | -| main.rs:526:13:526:13 | X | main.rs:504:9:504:21 | struct X | -| main.rs:526:13:526:23 | ...::a_method | main.rs:506:26:509:13 | fn a_method | -| main.rs:530:17:530:17 | m | main.rs:495:5:517:5 | mod m | -| main.rs:530:17:530:22 | ...::Bar | main.rs:500:9:502:9 | trait Bar | -| main.rs:531:13:531:13 | X | main.rs:504:9:504:21 | struct X | -| main.rs:531:13:531:23 | ...::a_method | main.rs:512:26:515:13 | fn a_method | -| main.rs:535:17:535:17 | m | main.rs:495:5:517:5 | mod m | -| main.rs:535:17:535:22 | ...::Bar | main.rs:500:9:502:9 | trait Bar | -| main.rs:536:13:536:13 | X | main.rs:504:9:504:21 | struct X | -| main.rs:536:13:536:23 | ...::a_method | main.rs:512:26:515:13 | fn a_method | -| main.rs:541:13:541:13 | m | main.rs:495:5:517:5 | mod m | -| main.rs:541:13:541:18 | ...::Bar | main.rs:500:9:502:9 | trait Bar | -| main.rs:541:13:541:28 | ...::a_method | main.rs:501:13:501:31 | fn a_method | -| main.rs:554:10:554:16 | MyTrait | main.rs:547:5:549:5 | trait MyTrait | -| main.rs:555:9:555:9 | S | main.rs:551:5:551:13 | struct S | -| main.rs:557:13:557:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:563:7:563:13 | MyTrait | main.rs:547:5:549:5 | trait MyTrait | -| main.rs:564:10:564:10 | T | main.rs:562:10:562:10 | T | -| main.rs:566:9:566:9 | T | main.rs:562:10:562:10 | T | -| main.rs:566:9:566:12 | ...::f | main.rs:548:9:548:20 | fn f | -| main.rs:567:9:567:15 | MyTrait | main.rs:547:5:549:5 | trait MyTrait | -| main.rs:567:9:567:18 | ...::f | main.rs:548:9:548:20 | fn f | -| main.rs:572:9:572:9 | g | main.rs:561:5:568:5 | fn g | -| main.rs:573:11:573:11 | S | main.rs:551:5:551:13 | struct S | -| main.rs:580:9:580:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:585:13:585:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:590:17:590:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:591:17:591:21 | super | main.rs:583:5:595:5 | mod m19 | -| main.rs:591:17:591:24 | ...::f | main.rs:584:9:586:9 | fn f | -| main.rs:592:17:592:21 | super | main.rs:583:5:595:5 | mod m19 | -| main.rs:592:17:592:28 | ...::super | main.rs:578:1:596:1 | mod m18 | -| main.rs:592:17:592:31 | ...::f | main.rs:579:5:581:5 | fn f | -| main.rs:609:13:609:17 | super | main.rs:598:1:623:1 | mod m21 | -| main.rs:609:13:609:22 | ...::m22 | main.rs:599:5:605:5 | mod m22 | -| main.rs:609:13:609:30 | ...::MyEnum | main.rs:600:9:602:9 | enum MyEnum | -| main.rs:610:13:610:16 | self | main.rs:600:9:602:9 | enum MyEnum | -| main.rs:614:13:614:17 | super | main.rs:598:1:623:1 | mod m21 | -| main.rs:614:13:614:22 | ...::m22 | main.rs:599:5:605:5 | mod m22 | -| main.rs:614:13:614:32 | ...::MyStruct | main.rs:604:9:604:28 | struct MyStruct | -| main.rs:615:13:615:16 | self | main.rs:604:9:604:28 | struct MyStruct | -| main.rs:619:21:619:26 | MyEnum | main.rs:600:9:602:9 | enum MyEnum | -| main.rs:619:21:619:29 | ...::A | main.rs:601:13:601:13 | A | -| main.rs:620:21:620:28 | MyStruct | main.rs:604:9:604:28 | struct MyStruct | -| main.rs:636:10:638:5 | Trait1::<...> | main.rs:626:5:631:5 | trait Trait1 | -| main.rs:637:7:637:10 | Self | main.rs:633:5:633:13 | struct S | -| main.rs:639:11:639:11 | S | main.rs:633:5:633:13 | struct S | -| main.rs:641:13:641:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:647:17:647:17 | S | main.rs:633:5:633:13 | struct S | -| main.rs:663:15:663:15 | T | main.rs:662:26:662:26 | T | -| main.rs:668:9:668:24 | GenericStruct::<...> | main.rs:661:5:664:5 | struct GenericStruct | -| main.rs:668:23:668:23 | T | main.rs:667:10:667:10 | T | -| main.rs:670:9:670:9 | T | main.rs:667:10:667:10 | T | -| main.rs:670:12:670:17 | TraitA | main.rs:653:5:655:5 | trait TraitA | -| main.rs:679:9:679:24 | GenericStruct::<...> | main.rs:661:5:664:5 | struct GenericStruct | -| main.rs:679:23:679:23 | T | main.rs:678:10:678:10 | T | -| main.rs:681:9:681:9 | T | main.rs:678:10:678:10 | T | -| main.rs:681:12:681:17 | TraitB | main.rs:657:5:659:5 | trait TraitB | -| main.rs:682:9:682:9 | T | main.rs:678:10:678:10 | T | -| main.rs:682:12:682:17 | TraitA | main.rs:653:5:655:5 | trait TraitA | -| main.rs:693:10:693:15 | TraitA | main.rs:653:5:655:5 | trait TraitA | -| main.rs:693:21:693:31 | Implementor | main.rs:690:5:690:23 | struct Implementor | -| main.rs:695:13:695:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:700:10:700:15 | TraitB | main.rs:657:5:659:5 | trait TraitB | -| main.rs:700:21:700:31 | Implementor | main.rs:690:5:690:23 | struct Implementor | -| main.rs:702:13:702:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:708:24:708:34 | Implementor | main.rs:690:5:690:23 | struct Implementor | -| main.rs:709:23:709:35 | GenericStruct | main.rs:661:5:664:5 | struct GenericStruct | -| main.rs:715:9:715:36 | GenericStruct::<...> | main.rs:661:5:664:5 | struct GenericStruct | -| main.rs:715:9:715:50 | ...::call_trait_a | main.rs:672:9:674:9 | fn call_trait_a | -| main.rs:715:25:715:35 | Implementor | main.rs:690:5:690:23 | struct Implementor | -| main.rs:718:9:718:36 | GenericStruct::<...> | main.rs:661:5:664:5 | struct GenericStruct | -| main.rs:718:9:718:47 | ...::call_both | main.rs:684:9:687:9 | fn call_both | -| main.rs:718:25:718:35 | Implementor | main.rs:690:5:690:23 | struct Implementor | -| main.rs:724:3:724:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:724:3:724:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:728:6:728:12 | AStruct | main.rs:727:1:727:17 | struct AStruct | -| main.rs:730:7:730:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:730:7:730:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:733:7:733:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:733:7:733:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:738:9:738:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:738:9:738:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | -| main.rs:738:9:738:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:739:9:739:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:739:9:739:19 | ...::result | {EXTERNAL LOCATION} | mod result | -| main.rs:739:9:739:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | -| main.rs:747:19:747:22 | Self | main.rs:741:5:749:5 | trait Reduce | -| main.rs:747:19:747:29 | ...::Input | main.rs:742:9:742:19 | type Input | -| main.rs:748:14:748:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:748:21:748:24 | Self | main.rs:741:5:749:5 | trait Reduce | -| main.rs:748:21:748:32 | ...::Output | main.rs:743:21:744:20 | type Output | -| main.rs:748:35:748:38 | Self | main.rs:741:5:749:5 | trait Reduce | -| main.rs:748:35:748:45 | ...::Error | main.rs:742:21:743:19 | type Error | -| main.rs:752:17:752:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:752:29:752:33 | Input | main.rs:751:19:751:23 | Input | -| main.rs:753:17:753:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:753:29:753:33 | Error | main.rs:751:26:751:30 | Error | -| main.rs:760:11:760:16 | Reduce | main.rs:741:5:749:5 | trait Reduce | -| main.rs:761:13:764:9 | MyImpl::<...> | main.rs:751:5:754:5 | struct MyImpl | -| main.rs:762:13:762:17 | Input | main.rs:758:13:758:17 | Input | -| main.rs:763:13:763:17 | Error | main.rs:759:13:759:17 | Error | -| main.rs:766:22:769:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:767:13:767:17 | Input | main.rs:758:13:758:17 | Input | -| main.rs:768:13:768:16 | Self | main.rs:751:5:754:5 | struct MyImpl | -| main.rs:768:13:768:23 | ...::Error | main.rs:770:11:774:9 | type Error | -| main.rs:771:22:773:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:772:11:772:15 | Error | main.rs:759:13:759:17 | Error | -| main.rs:776:13:776:17 | Input | main.rs:758:13:758:17 | Input | -| main.rs:781:19:781:22 | Self | main.rs:751:5:754:5 | struct MyImpl | -| main.rs:781:19:781:29 | ...::Input | main.rs:766:9:770:9 | type Input | -| main.rs:782:14:785:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:783:13:783:16 | Self | main.rs:751:5:754:5 | struct MyImpl | -| main.rs:783:13:783:24 | ...::Output | main.rs:774:11:777:9 | type Output | -| main.rs:784:13:784:16 | Self | main.rs:751:5:754:5 | struct MyImpl | -| main.rs:784:13:784:23 | ...::Error | main.rs:770:11:774:9 | type Error | -| main.rs:791:5:791:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:791:11:791:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:793:15:793:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:793:15:793:25 | ...::string | {EXTERNAL LOCATION} | mod string | -| main.rs:793:15:793:33 | ...::String | {EXTERNAL LOCATION} | struct String | -| main.rs:803:7:803:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:803:7:803:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | -| main.rs:804:10:804:15 | ATrait | main.rs:799:5:801:5 | trait ATrait | -| main.rs:804:21:804:23 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:806:11:806:13 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:812:17:812:19 | Foo | main.rs:797:5:797:15 | struct Foo | -| main.rs:818:22:818:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:818:29:818:31 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:819:17:819:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:820:17:820:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:820:24:820:26 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:821:13:821:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:822:17:822:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:824:13:824:16 | None | {EXTERNAL LOCATION} | None | -| main.rs:825:17:825:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:834:19:834:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:834:26:834:28 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:835:26:835:29 | test | main.rs:817:5:831:5 | fn test | -| main.rs:841:14:841:16 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:846:17:846:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:848:13:848:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:853:13:853:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:853:18:853:18 | z | main.rs:840:5:842:12 | Const | -| main.rs:853:24:853:24 | z | main.rs:840:5:842:12 | Const | -| main.rs:860:5:860:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:860:5:860:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:860:5:860:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:860:5:860:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:860:5:860:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:861:5:861:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:861:5:861:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:862:5:862:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:862:5:862:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:862:5:862:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:862:5:862:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:863:5:863:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:864:5:864:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:865:5:865:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:865:5:865:12 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:866:5:866:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:866:5:866:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:866:5:866:13 | ...::g | main.rs:30:9:34:9 | fn g | -| main.rs:867:5:867:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:867:5:867:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:867:5:867:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | -| main.rs:867:5:867:17 | ...::h | main.rs:37:27:41:13 | fn h | -| main.rs:868:5:868:6 | m4 | main.rs:46:1:53:1 | mod m4 | -| main.rs:868:5:868:9 | ...::i | main.rs:49:5:52:5 | fn i | -| main.rs:869:5:869:5 | h | main.rs:57:1:76:1 | fn h | -| main.rs:870:5:870:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:871:5:871:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:872:5:872:5 | j | main.rs:104:1:108:1 | fn j | -| main.rs:873:5:873:6 | m6 | main.rs:116:1:128:1 | mod m6 | -| main.rs:873:5:873:9 | ...::g | main.rs:121:5:127:5 | fn g | -| main.rs:874:5:874:6 | m7 | main.rs:130:1:149:1 | mod m7 | -| main.rs:874:5:874:9 | ...::f | main.rs:141:5:148:5 | fn f | -| main.rs:875:5:875:6 | m8 | main.rs:151:1:205:1 | mod m8 | -| main.rs:875:5:875:9 | ...::g | main.rs:189:5:204:5 | fn g | -| main.rs:876:5:876:6 | m9 | main.rs:207:1:215:1 | mod m9 | -| main.rs:876:5:876:9 | ...::f | main.rs:210:5:214:5 | fn f | -| main.rs:877:5:877:7 | m11 | main.rs:238:1:275:1 | mod m11 | -| main.rs:877:5:877:10 | ...::f | main.rs:243:5:246:5 | fn f | -| main.rs:878:5:878:7 | m15 | main.rs:306:1:375:1 | mod m15 | -| main.rs:878:5:878:10 | ...::f | main.rs:362:5:374:5 | fn f | -| main.rs:879:5:879:7 | m16 | main.rs:377:1:492:1 | mod m16 | -| main.rs:879:5:879:10 | ...::f | main.rs:446:5:470:5 | fn f | -| main.rs:880:5:880:20 | trait_visibility | main.rs:494:1:544:1 | mod trait_visibility | -| main.rs:880:5:880:23 | ...::f | main.rs:521:5:543:5 | fn f | -| main.rs:881:5:881:7 | m17 | main.rs:546:1:576:1 | mod m17 | -| main.rs:881:5:881:10 | ...::f | main.rs:570:5:575:5 | fn f | -| main.rs:882:5:882:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:882:5:882:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:883:5:883:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:883:5:883:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:884:5:884:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | -| main.rs:884:5:884:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:885:5:885:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:886:5:886:12 | my_alias | main.rs:1:1:1:7 | mod my | -| main.rs:886:5:886:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:887:5:887:7 | m18 | main.rs:578:1:596:1 | mod m18 | -| main.rs:887:5:887:12 | ...::m19 | main.rs:583:5:595:5 | mod m19 | -| main.rs:887:5:887:17 | ...::m20 | main.rs:588:9:594:9 | mod m20 | -| main.rs:887:5:887:20 | ...::g | main.rs:589:13:593:13 | fn g | -| main.rs:888:5:888:7 | m23 | main.rs:625:1:650:1 | mod m23 | -| main.rs:888:5:888:10 | ...::f | main.rs:645:5:649:5 | fn f | -| main.rs:889:5:889:7 | m24 | main.rs:652:1:720:1 | mod m24 | -| main.rs:889:5:889:10 | ...::f | main.rs:706:5:719:5 | fn f | -| main.rs:890:5:890:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:890:5:890:11 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:891:5:891:13 | z_changed | main.rs:725:1:725:9 | fn z_changed | -| main.rs:892:5:892:11 | AStruct | main.rs:727:1:727:17 | struct AStruct | -| main.rs:892:5:892:22 | ...::z_on_type | main.rs:731:5:731:17 | fn z_on_type | -| main.rs:893:5:893:11 | AStruct | main.rs:727:1:727:17 | struct AStruct | -| main.rs:894:5:894:29 | impl_with_attribute_macro | main.rs:795:1:814:1 | mod impl_with_attribute_macro | -| main.rs:894:5:894:35 | ...::test | main.rs:810:5:813:5 | fn test | -| main.rs:895:5:895:12 | patterns | main.rs:816:1:857:1 | mod patterns | -| main.rs:895:5:895:18 | ...::test | main.rs:817:5:831:5 | fn test | +| main.rs:487:10:487:15 | Trait3 | main.rs:472:5:476:5 | trait Trait3 | +| main.rs:487:21:487:22 | S2 | main.rs:484:5:484:14 | struct S2 | +| main.rs:488:26:488:28 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:492:20:492:23 | Self | main.rs:484:5:484:14 | struct S2 | +| main.rs:492:20:492:34 | ...::AssocType | main.rs:487:26:489:9 | type AssocType | +| main.rs:492:20:492:34 | ...::AssocType | main.rs:497:26:499:9 | type AssocType | +| main.rs:497:10:497:15 | Trait4 | main.rs:478:5:482:5 | trait Trait4 | +| main.rs:497:21:497:22 | S2 | main.rs:484:5:484:14 | struct S2 | +| main.rs:498:26:498:29 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:502:13:502:16 | Self | main.rs:484:5:484:14 | struct S2 | +| main.rs:502:13:502:19 | ...::f | main.rs:489:11:493:9 | fn f | +| main.rs:503:13:503:14 | S2 | main.rs:484:5:484:14 | struct S2 | +| main.rs:503:13:503:17 | ...::f | main.rs:489:11:493:9 | fn f | +| main.rs:504:20:504:23 | Self | main.rs:484:5:484:14 | struct S2 | +| main.rs:504:20:504:34 | ...::AssocType | main.rs:487:26:489:9 | type AssocType | +| main.rs:504:20:504:34 | ...::AssocType | main.rs:497:26:499:9 | type AssocType | +| main.rs:521:14:521:16 | Foo | main.rs:511:9:513:9 | trait Foo | +| main.rs:521:22:521:22 | X | main.rs:519:9:519:21 | struct X | +| main.rs:523:17:523:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:527:14:527:16 | Bar | main.rs:515:9:517:9 | trait Bar | +| main.rs:527:22:527:22 | X | main.rs:519:9:519:21 | struct X | +| main.rs:529:17:529:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:534:9:534:9 | m | main.rs:510:5:532:5 | mod m | +| main.rs:534:9:534:12 | ...::X | main.rs:519:9:519:21 | struct X | +| main.rs:537:17:537:17 | X | main.rs:519:9:519:21 | struct X | +| main.rs:540:17:540:17 | m | main.rs:510:5:532:5 | mod m | +| main.rs:540:17:540:22 | ...::Foo | main.rs:511:9:513:9 | trait Foo | +| main.rs:541:13:541:13 | X | main.rs:519:9:519:21 | struct X | +| main.rs:541:13:541:23 | ...::a_method | main.rs:521:26:524:13 | fn a_method | +| main.rs:545:17:545:17 | m | main.rs:510:5:532:5 | mod m | +| main.rs:545:17:545:22 | ...::Bar | main.rs:515:9:517:9 | trait Bar | +| main.rs:546:13:546:13 | X | main.rs:519:9:519:21 | struct X | +| main.rs:546:13:546:23 | ...::a_method | main.rs:527:26:530:13 | fn a_method | +| main.rs:550:17:550:17 | m | main.rs:510:5:532:5 | mod m | +| main.rs:550:17:550:22 | ...::Bar | main.rs:515:9:517:9 | trait Bar | +| main.rs:551:13:551:13 | X | main.rs:519:9:519:21 | struct X | +| main.rs:551:13:551:23 | ...::a_method | main.rs:527:26:530:13 | fn a_method | +| main.rs:556:13:556:13 | m | main.rs:510:5:532:5 | mod m | +| main.rs:556:13:556:18 | ...::Bar | main.rs:515:9:517:9 | trait Bar | +| main.rs:556:13:556:28 | ...::a_method | main.rs:516:13:516:31 | fn a_method | +| main.rs:569:10:569:16 | MyTrait | main.rs:562:5:564:5 | trait MyTrait | +| main.rs:570:9:570:9 | S | main.rs:566:5:566:13 | struct S | +| main.rs:572:13:572:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:578:7:578:13 | MyTrait | main.rs:562:5:564:5 | trait MyTrait | +| main.rs:579:10:579:10 | T | main.rs:577:10:577:10 | T | +| main.rs:581:9:581:9 | T | main.rs:577:10:577:10 | T | +| main.rs:581:9:581:12 | ...::f | main.rs:563:9:563:20 | fn f | +| main.rs:582:9:582:15 | MyTrait | main.rs:562:5:564:5 | trait MyTrait | +| main.rs:582:9:582:18 | ...::f | main.rs:563:9:563:20 | fn f | +| main.rs:587:9:587:9 | g | main.rs:576:5:583:5 | fn g | +| main.rs:588:11:588:11 | S | main.rs:566:5:566:13 | struct S | +| main.rs:595:9:595:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:600:13:600:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:605:17:605:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:606:17:606:21 | super | main.rs:598:5:610:5 | mod m19 | +| main.rs:606:17:606:24 | ...::f | main.rs:599:9:601:9 | fn f | +| main.rs:607:17:607:21 | super | main.rs:598:5:610:5 | mod m19 | +| main.rs:607:17:607:28 | ...::super | main.rs:593:1:611:1 | mod m18 | +| main.rs:607:17:607:31 | ...::f | main.rs:594:5:596:5 | fn f | +| main.rs:624:13:624:17 | super | main.rs:613:1:638:1 | mod m21 | +| main.rs:624:13:624:22 | ...::m22 | main.rs:614:5:620:5 | mod m22 | +| main.rs:624:13:624:30 | ...::MyEnum | main.rs:615:9:617:9 | enum MyEnum | +| main.rs:625:13:625:16 | self | main.rs:615:9:617:9 | enum MyEnum | +| main.rs:629:13:629:17 | super | main.rs:613:1:638:1 | mod m21 | +| main.rs:629:13:629:22 | ...::m22 | main.rs:614:5:620:5 | mod m22 | +| main.rs:629:13:629:32 | ...::MyStruct | main.rs:619:9:619:28 | struct MyStruct | +| main.rs:630:13:630:16 | self | main.rs:619:9:619:28 | struct MyStruct | +| main.rs:634:21:634:26 | MyEnum | main.rs:615:9:617:9 | enum MyEnum | +| main.rs:634:21:634:29 | ...::A | main.rs:616:13:616:13 | A | +| main.rs:635:21:635:28 | MyStruct | main.rs:619:9:619:28 | struct MyStruct | +| main.rs:651:10:653:5 | Trait1::<...> | main.rs:641:5:646:5 | trait Trait1 | +| main.rs:652:7:652:10 | Self | main.rs:648:5:648:13 | struct S | +| main.rs:654:11:654:11 | S | main.rs:648:5:648:13 | struct S | +| main.rs:656:13:656:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:662:17:662:17 | S | main.rs:648:5:648:13 | struct S | +| main.rs:678:15:678:15 | T | main.rs:677:26:677:26 | T | +| main.rs:683:9:683:24 | GenericStruct::<...> | main.rs:676:5:679:5 | struct GenericStruct | +| main.rs:683:23:683:23 | T | main.rs:682:10:682:10 | T | +| main.rs:685:9:685:9 | T | main.rs:682:10:682:10 | T | +| main.rs:685:12:685:17 | TraitA | main.rs:668:5:670:5 | trait TraitA | +| main.rs:694:9:694:24 | GenericStruct::<...> | main.rs:676:5:679:5 | struct GenericStruct | +| main.rs:694:23:694:23 | T | main.rs:693:10:693:10 | T | +| main.rs:696:9:696:9 | T | main.rs:693:10:693:10 | T | +| main.rs:696:12:696:17 | TraitB | main.rs:672:5:674:5 | trait TraitB | +| main.rs:697:9:697:9 | T | main.rs:693:10:693:10 | T | +| main.rs:697:12:697:17 | TraitA | main.rs:668:5:670:5 | trait TraitA | +| main.rs:708:10:708:15 | TraitA | main.rs:668:5:670:5 | trait TraitA | +| main.rs:708:21:708:31 | Implementor | main.rs:705:5:705:23 | struct Implementor | +| main.rs:710:13:710:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:715:10:715:15 | TraitB | main.rs:672:5:674:5 | trait TraitB | +| main.rs:715:21:715:31 | Implementor | main.rs:705:5:705:23 | struct Implementor | +| main.rs:717:13:717:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:723:24:723:34 | Implementor | main.rs:705:5:705:23 | struct Implementor | +| main.rs:724:23:724:35 | GenericStruct | main.rs:676:5:679:5 | struct GenericStruct | +| main.rs:730:9:730:36 | GenericStruct::<...> | main.rs:676:5:679:5 | struct GenericStruct | +| main.rs:730:9:730:50 | ...::call_trait_a | main.rs:687:9:689:9 | fn call_trait_a | +| main.rs:730:25:730:35 | Implementor | main.rs:705:5:705:23 | struct Implementor | +| main.rs:733:9:733:36 | GenericStruct::<...> | main.rs:676:5:679:5 | struct GenericStruct | +| main.rs:733:9:733:47 | ...::call_both | main.rs:699:9:702:9 | fn call_both | +| main.rs:733:25:733:35 | Implementor | main.rs:705:5:705:23 | struct Implementor | +| main.rs:739:3:739:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:739:3:739:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:743:6:743:12 | AStruct | main.rs:742:1:742:17 | struct AStruct | +| main.rs:745:7:745:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:745:7:745:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:748:7:748:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:748:7:748:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:753:9:753:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:753:9:753:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | +| main.rs:753:9:753:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:754:9:754:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:754:9:754:19 | ...::result | {EXTERNAL LOCATION} | mod result | +| main.rs:754:9:754:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | +| main.rs:762:19:762:22 | Self | main.rs:756:5:764:5 | trait Reduce | +| main.rs:762:19:762:29 | ...::Input | main.rs:757:9:757:19 | type Input | +| main.rs:763:14:763:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:763:21:763:24 | Self | main.rs:756:5:764:5 | trait Reduce | +| main.rs:763:21:763:32 | ...::Output | main.rs:758:21:759:20 | type Output | +| main.rs:763:35:763:38 | Self | main.rs:756:5:764:5 | trait Reduce | +| main.rs:763:35:763:45 | ...::Error | main.rs:757:21:758:19 | type Error | +| main.rs:767:17:767:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:767:29:767:33 | Input | main.rs:766:19:766:23 | Input | +| main.rs:768:17:768:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:768:29:768:33 | Error | main.rs:766:26:766:30 | Error | +| main.rs:775:11:775:16 | Reduce | main.rs:756:5:764:5 | trait Reduce | +| main.rs:776:13:779:9 | MyImpl::<...> | main.rs:766:5:769:5 | struct MyImpl | +| main.rs:777:13:777:17 | Input | main.rs:773:13:773:17 | Input | +| main.rs:778:13:778:17 | Error | main.rs:774:13:774:17 | Error | +| main.rs:781:22:784:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:782:13:782:17 | Input | main.rs:773:13:773:17 | Input | +| main.rs:783:13:783:16 | Self | main.rs:766:5:769:5 | struct MyImpl | +| main.rs:783:13:783:23 | ...::Error | main.rs:785:11:789:9 | type Error | +| main.rs:786:22:788:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:787:11:787:15 | Error | main.rs:774:13:774:17 | Error | +| main.rs:791:13:791:17 | Input | main.rs:773:13:773:17 | Input | +| main.rs:796:19:796:22 | Self | main.rs:766:5:769:5 | struct MyImpl | +| main.rs:796:19:796:29 | ...::Input | main.rs:781:9:785:9 | type Input | +| main.rs:797:14:800:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:798:13:798:16 | Self | main.rs:766:5:769:5 | struct MyImpl | +| main.rs:798:13:798:24 | ...::Output | main.rs:789:11:792:9 | type Output | +| main.rs:799:13:799:16 | Self | main.rs:766:5:769:5 | struct MyImpl | +| main.rs:799:13:799:23 | ...::Error | main.rs:785:11:789:9 | type Error | +| main.rs:806:5:806:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:806:11:806:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:808:15:808:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:808:15:808:25 | ...::string | {EXTERNAL LOCATION} | mod string | +| main.rs:808:15:808:33 | ...::String | {EXTERNAL LOCATION} | struct String | +| main.rs:818:7:818:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:818:7:818:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | +| main.rs:819:10:819:15 | ATrait | main.rs:814:5:816:5 | trait ATrait | +| main.rs:819:21:819:23 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:821:11:821:13 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:827:17:827:19 | Foo | main.rs:812:5:812:15 | struct Foo | +| main.rs:833:22:833:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:833:29:833:31 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:834:17:834:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:835:17:835:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:835:24:835:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:836:13:836:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:837:17:837:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:839:13:839:16 | None | {EXTERNAL LOCATION} | None | +| main.rs:840:17:840:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:849:19:849:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:849:26:849:28 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:850:26:850:29 | test | main.rs:832:5:846:5 | fn test | +| main.rs:856:14:856:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:861:17:861:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:863:13:863:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:868:13:868:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:868:18:868:18 | z | main.rs:855:5:857:12 | Const | +| main.rs:868:24:868:24 | z | main.rs:855:5:857:12 | Const | +| main.rs:875:5:875:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:875:5:875:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:875:5:875:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:875:5:875:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:875:5:875:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:876:5:876:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:876:5:876:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:877:5:877:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:877:5:877:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:877:5:877:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:877:5:877:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:878:5:878:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:879:5:879:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:880:5:880:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:880:5:880:12 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:881:5:881:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:881:5:881:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:881:5:881:13 | ...::g | main.rs:30:9:34:9 | fn g | +| main.rs:882:5:882:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:882:5:882:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:882:5:882:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | +| main.rs:882:5:882:17 | ...::h | main.rs:37:27:41:13 | fn h | +| main.rs:883:5:883:6 | m4 | main.rs:46:1:53:1 | mod m4 | +| main.rs:883:5:883:9 | ...::i | main.rs:49:5:52:5 | fn i | +| main.rs:884:5:884:5 | h | main.rs:57:1:76:1 | fn h | +| main.rs:885:5:885:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:886:5:886:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:887:5:887:5 | j | main.rs:104:1:108:1 | fn j | +| main.rs:888:5:888:6 | m6 | main.rs:116:1:128:1 | mod m6 | +| main.rs:888:5:888:9 | ...::g | main.rs:121:5:127:5 | fn g | +| main.rs:889:5:889:6 | m7 | main.rs:130:1:149:1 | mod m7 | +| main.rs:889:5:889:9 | ...::f | main.rs:141:5:148:5 | fn f | +| main.rs:890:5:890:6 | m8 | main.rs:151:1:205:1 | mod m8 | +| main.rs:890:5:890:9 | ...::g | main.rs:189:5:204:5 | fn g | +| main.rs:891:5:891:6 | m9 | main.rs:207:1:215:1 | mod m9 | +| main.rs:891:5:891:9 | ...::f | main.rs:210:5:214:5 | fn f | +| main.rs:892:5:892:7 | m11 | main.rs:238:1:275:1 | mod m11 | +| main.rs:892:5:892:10 | ...::f | main.rs:243:5:246:5 | fn f | +| main.rs:893:5:893:7 | m15 | main.rs:306:1:375:1 | mod m15 | +| main.rs:893:5:893:10 | ...::f | main.rs:362:5:374:5 | fn f | +| main.rs:894:5:894:7 | m16 | main.rs:377:1:507:1 | mod m16 | +| main.rs:894:5:894:10 | ...::f | main.rs:446:5:470:5 | fn f | +| main.rs:895:5:895:20 | trait_visibility | main.rs:509:1:559:1 | mod trait_visibility | +| main.rs:895:5:895:23 | ...::f | main.rs:536:5:558:5 | fn f | +| main.rs:896:5:896:7 | m17 | main.rs:561:1:591:1 | mod m17 | +| main.rs:896:5:896:10 | ...::f | main.rs:585:5:590:5 | fn f | +| main.rs:897:5:897:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:897:5:897:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:898:5:898:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:898:5:898:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:899:5:899:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | +| main.rs:899:5:899:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:900:5:900:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:901:5:901:12 | my_alias | main.rs:1:1:1:7 | mod my | +| main.rs:901:5:901:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:902:5:902:7 | m18 | main.rs:593:1:611:1 | mod m18 | +| main.rs:902:5:902:12 | ...::m19 | main.rs:598:5:610:5 | mod m19 | +| main.rs:902:5:902:17 | ...::m20 | main.rs:603:9:609:9 | mod m20 | +| main.rs:902:5:902:20 | ...::g | main.rs:604:13:608:13 | fn g | +| main.rs:903:5:903:7 | m23 | main.rs:640:1:665:1 | mod m23 | +| main.rs:903:5:903:10 | ...::f | main.rs:660:5:664:5 | fn f | +| main.rs:904:5:904:7 | m24 | main.rs:667:1:735:1 | mod m24 | +| main.rs:904:5:904:10 | ...::f | main.rs:721:5:734:5 | fn f | +| main.rs:905:5:905:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:905:5:905:11 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:906:5:906:13 | z_changed | main.rs:740:1:740:9 | fn z_changed | +| main.rs:907:5:907:11 | AStruct | main.rs:742:1:742:17 | struct AStruct | +| main.rs:907:5:907:22 | ...::z_on_type | main.rs:746:5:746:17 | fn z_on_type | +| main.rs:908:5:908:11 | AStruct | main.rs:742:1:742:17 | struct AStruct | +| main.rs:909:5:909:29 | impl_with_attribute_macro | main.rs:810:1:829:1 | mod impl_with_attribute_macro | +| main.rs:909:5:909:35 | ...::test | main.rs:825:5:828:5 | fn test | +| main.rs:910:5:910:12 | patterns | main.rs:831:1:872:1 | mod patterns | +| main.rs:910:5:910:18 | ...::test | main.rs:832:5:846:5 | fn test | | my2/mod.rs:4:5:4:11 | println | {EXTERNAL LOCATION} | MacroRules | | 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 | @@ -525,7 +533,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:57:1:76:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:896:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:911:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:57:1:76:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | From 7e5131891cb23d262e243e5fffcb2e1ed3fb1dc9 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 26 Nov 2025 11:47:27 +0100 Subject: [PATCH 4/8] Rust: Special-case `Self::AssocType` in path resolution --- rust/ql/lib/codeql/rust/internal/PathResolution.qll | 10 ++++++++++ .../CONSISTENCY/PathResolutionConsistency.expected | 3 --- rust/ql/test/library-tests/path-resolution/main.rs | 4 ++-- .../path-resolution/path-resolution.expected | 2 -- .../CONSISTENCY/PathResolutionConsistency.expected | 4 ---- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index b5c9025c8480..9266a74c1651 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1897,6 +1897,16 @@ private ItemNode resolvePathCandQualified(PathExt qualifier, ItemNode q, PathExt q = resolvePathCandQualifier(qualifier, path, name) and result = getASuccessor(q, name, ns, kind, useOpt) and checkQualifiedVisibility(path, result, kind, useOpt) + | + // Special case for `Self::AssocType`; this always refers to the associated + // type in the enclosing `impl` block, if available. + forall(ImplItemNode impl, TypeAliasItemNode alias | + qualifier = impl.getASelfPath() and alias = result + | + alias = impl.getAnAssocItem() + or + not exists(impl.getAssocItem(name).(TypeAliasItemNode)) + ) ) } diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 2bab7ae6b92f..10da6bb9c375 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -4,6 +4,3 @@ multipleCallTargets | main.rs:369:9:371:16 | ...::f(...) | | main.rs:450:9:454:16 | ...::f(...) | | main.rs:455:9:459:16 | ...::f(...) | -multiplePathResolutions -| main.rs:492:20:492:34 | ...::AssocType | -| main.rs:504:20:504:34 | ...::AssocType | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 255846216ddb..b843223bb07c 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -489,7 +489,7 @@ mod m16 { ; // S2Trait3AssocType fn f(&self) { - let x: Self::AssocType = 42; // $ item=S2Trait3AssocType $ SPURIOUS: item=S2Trait4AssocType + let x: Self::AssocType = 42; // $ item=S2Trait3AssocType } // S2asTrait3::f } @@ -501,7 +501,7 @@ mod m16 { fn g(&self) { Self::f(&self); // $ item=S2asTrait3::f S2::f(&self); // $ item=S2asTrait3::f - let x: Self::AssocType = true; // $ item=S2Trait4AssocType $ SPURIOUS: item=S2Trait3AssocType + let x: Self::AssocType = true; // $ item=S2Trait4AssocType } } } 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 b802dff6a3c4..9c7c2ecd99d4 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -269,7 +269,6 @@ resolvePath | main.rs:488:26:488:28 | i32 | {EXTERNAL LOCATION} | struct i32 | | main.rs:492:20:492:23 | Self | main.rs:484:5:484:14 | struct S2 | | main.rs:492:20:492:34 | ...::AssocType | main.rs:487:26:489:9 | type AssocType | -| main.rs:492:20:492:34 | ...::AssocType | main.rs:497:26:499:9 | type AssocType | | main.rs:497:10:497:15 | Trait4 | main.rs:478:5:482:5 | trait Trait4 | | main.rs:497:21:497:22 | S2 | main.rs:484:5:484:14 | struct S2 | | main.rs:498:26:498:29 | bool | {EXTERNAL LOCATION} | struct bool | @@ -278,7 +277,6 @@ resolvePath | main.rs:503:13:503:14 | S2 | main.rs:484:5:484:14 | struct S2 | | main.rs:503:13:503:17 | ...::f | main.rs:489:11:493:9 | fn f | | main.rs:504:20:504:23 | Self | main.rs:484:5:484:14 | struct S2 | -| main.rs:504:20:504:34 | ...::AssocType | main.rs:487:26:489:9 | type AssocType | | main.rs:504:20:504:34 | ...::AssocType | main.rs:497:26:499:9 | type AssocType | | main.rs:521:14:521:16 | Foo | main.rs:511:9:513:9 | trait Foo | | main.rs:521:22:521:22 | X | main.rs:519:9:519:21 | struct X | diff --git a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected index e78621bebd5b..16db4f5c0903 100644 --- a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected @@ -11,7 +11,3 @@ multipleCallTargets | main.rs:2642:13:2642:31 | ...::from(...) | | main.rs:2643:13:2643:31 | ...::from(...) | | main.rs:2644:13:2644:31 | ...::from(...) | -multiplePathResolutions -| main.rs:2463:41:2463:52 | ...::Output | -| main.rs:2472:38:2472:49 | ...::Output | -| main.rs:2484:42:2484:53 | ...::Output | From 77df65f2bc85d9c60e9b8c128b3a018e3476aa8d Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 1 Dec 2025 09:07:47 +0100 Subject: [PATCH 5/8] Address review comment --- .../codeql/rust/internal/PathResolution.qll | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 9266a74c1651..9503b4304d33 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1887,26 +1887,43 @@ private predicate checkQualifiedVisibility( not i instanceof TypeParam } +pragma[nomagic] +private predicate isImplSelfQualifiedPath( + ImplItemNode impl, PathExt qualifier, PathExt path, string name +) { + qualifier = impl.getASelfPath() and + qualifier = path.getQualifier() and + name = path.getText() +} + +private TypeAliasItemNode resolveSelfAssocType(PathExt qualifier, PathExt path) { + exists(ImplItemNode impl, string name | + isImplSelfQualifiedPath(impl, qualifier, path, name) and + result = impl.getAssocItem(name) + ) +} + /** * Gets the item that `path` resolves to in `ns` when `qualifier` is the * qualifier of `path` and `qualifier` resolves to `q`, if any. */ pragma[nomagic] private ItemNode resolvePathCandQualified(PathExt qualifier, ItemNode q, PathExt path, Namespace ns) { + // Special case for `Self::AssocType`; this always refers to the associated + // type in the enclosing `impl` block, if available. + q = resolvePathCandQualifier(qualifier, path, _) and + ns.isType() and + result = resolveSelfAssocType(qualifier, path) + or + ( + not exists(resolveSelfAssocType(qualifier, path)) + or + not ns.isType() + ) and exists(string name, SuccessorKind kind, UseOption useOpt | q = resolvePathCandQualifier(qualifier, path, name) and result = getASuccessor(q, name, ns, kind, useOpt) and checkQualifiedVisibility(path, result, kind, useOpt) - | - // Special case for `Self::AssocType`; this always refers to the associated - // type in the enclosing `impl` block, if available. - forall(ImplItemNode impl, TypeAliasItemNode alias | - qualifier = impl.getASelfPath() and alias = result - | - alias = impl.getAnAssocItem() - or - not exists(impl.getAssocItem(name).(TypeAliasItemNode)) - ) ) } From 250d15aef2f9b414f8167aaafc071ff697178d1b Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 1 Dec 2025 09:54:22 +0100 Subject: [PATCH 6/8] Rust: More path resolution tests --- .../PathResolutionConsistency.expected | 2 + .../library-tests/path-resolution/main.rs | 41 ++ .../path-resolution/path-resolution.expected | 522 +++++++++--------- 3 files changed, 318 insertions(+), 247 deletions(-) diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 10da6bb9c375..07d2f2ed6d0c 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -4,3 +4,5 @@ multipleCallTargets | main.rs:369:9:371:16 | ...::f(...) | | main.rs:450:9:454:16 | ...::f(...) | | main.rs:455:9:459:16 | ...::f(...) | +| main.rs:534:13:534:25 | ...::Assoc(...) | +| main.rs:545:14:545:26 | ...::Assoc(...) | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index b843223bb07c..697826f760d7 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -504,6 +504,47 @@ mod m16 { let x: Self::AssocType = true; // $ item=S2Trait4AssocType } } + + trait Trait5 { + type Assoc; // Trait5Assoc + + fn Assoc() -> Self::Assoc; // $ item=Trait5Assoc + } + + #[rustfmt::skip] + impl Trait5 for S { // $ item=Trait5 item=I90 + type Assoc = i32 // $ item=i32 + ; // AssocType + + fn Assoc() + -> Self::Assoc { // $ item=AssocType + Self::Assoc() + 1 // $ item=AssocFunc + } // AssocFunc + } + + struct S3(T3); // $ item=T3 + + #[rustfmt::skip] + impl Trait5 for S3 { // $ item=Trait5 item=S3 item=i32 + type Assoc = i32 // $ item=i32 + ; // S3i32AssocType + + fn Assoc() + -> Self::Assoc { // $ item=S3i32AssocType + Self::Assoc() + 1 // $ item=S3i32AssocFunc $ SPURIOUS: item=S3boolAssocFunc + } // S3i32AssocFunc + } + + #[rustfmt::skip] + impl Trait5 for S3 { // $ item=Trait5 item=S3 item=bool + type Assoc = bool // $ item=bool + ; // S3boolAssocType + + fn Assoc() + -> Self::Assoc { // $ item=S3boolAssocType + !Self::Assoc() // $ item=S3boolAssocFunc $ SPURIOUS: item=S3i32AssocFunc + } // S3boolAssocFunc + } } mod trait_visibility { 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 9c7c2ecd99d4..c742850ba927 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -18,21 +18,21 @@ mod | main.rs:291:1:304:1 | mod m13 | | main.rs:295:5:303:5 | mod m14 | | main.rs:306:1:375:1 | mod m15 | -| main.rs:377:1:507:1 | mod m16 | -| main.rs:509:1:559:1 | mod trait_visibility | -| main.rs:510:5:532:5 | mod m | -| main.rs:561:1:591:1 | mod m17 | -| main.rs:593:1:611:1 | mod m18 | -| main.rs:598:5:610:5 | mod m19 | -| main.rs:603:9:609:9 | mod m20 | -| main.rs:613:1:638:1 | mod m21 | -| main.rs:614:5:620:5 | mod m22 | -| main.rs:622:5:637:5 | mod m33 | -| main.rs:640:1:665:1 | mod m23 | -| main.rs:667:1:735:1 | mod m24 | -| main.rs:752:1:804:1 | mod associated_types | -| main.rs:810:1:829:1 | mod impl_with_attribute_macro | -| main.rs:831:1:872:1 | mod patterns | +| main.rs:377:1:548:1 | mod m16 | +| main.rs:550:1:600:1 | mod trait_visibility | +| main.rs:551:5:573:5 | mod m | +| main.rs:602:1:632:1 | mod m17 | +| main.rs:634:1:652:1 | mod m18 | +| main.rs:639:5:651:5 | mod m19 | +| main.rs:644:9:650:9 | mod m20 | +| main.rs:654:1:679:1 | mod m21 | +| main.rs:655:5:661:5 | mod m22 | +| main.rs:663:5:678:5 | mod m33 | +| main.rs:681:1:706:1 | mod m23 | +| main.rs:708:1:776:1 | mod m24 | +| main.rs:793:1:845:1 | mod associated_types | +| main.rs:851:1:870:1 | mod impl_with_attribute_macro | +| main.rs:872:1:913:1 | mod patterns | | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:20:1:20:12 | mod my3 | | my2/mod.rs:22:1:23:10 | mod mymod | @@ -73,7 +73,7 @@ resolvePath | main.rs:37:17:37:24 | ...::f | main.rs:26:9:28:9 | fn f | | main.rs:39:17:39:23 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:40:17:40:17 | f | main.rs:26:9:28:9 | fn f | -| main.rs:47:9:47:13 | super | main.rs:1:1:911:2 | SourceFile | +| main.rs:47:9:47:13 | super | main.rs:1:1:952:2 | SourceFile | | main.rs:47:9:47:17 | ...::m1 | main.rs:20:1:44:1 | mod m1 | | main.rs:47:9:47:21 | ...::m2 | main.rs:25:5:43:5 | mod m2 | | main.rs:47:9:47:24 | ...::g | main.rs:30:9:34:9 | fn g | @@ -88,7 +88,7 @@ resolvePath | main.rs:68:17:68:19 | Foo | main.rs:66:9:66:21 | struct Foo | | main.rs:71:13:71:15 | Foo | main.rs:60:5:60:17 | struct Foo | | main.rs:73:5:73:5 | f | main.rs:62:5:69:5 | fn f | -| main.rs:75:5:75:8 | self | main.rs:1:1:911:2 | SourceFile | +| main.rs:75:5:75:8 | self | main.rs:1:1:952:2 | SourceFile | | main.rs:75:5:75:11 | ...::i | main.rs:78:1:90:1 | fn i | | main.rs:79:5:79:11 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:81:13:81:15 | Foo | main.rs:55:1:55:13 | struct Foo | @@ -110,7 +110,7 @@ resolvePath | main.rs:112:9:112:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:118:9:118:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:122:9:122:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:125:13:125:17 | super | main.rs:1:1:911:2 | SourceFile | +| main.rs:125:13:125:17 | super | main.rs:1:1:952:2 | SourceFile | | main.rs:125:13:125:21 | ...::m5 | main.rs:110:1:114:1 | mod m5 | | main.rs:126:9:126:9 | f | main.rs:111:5:113:5 | fn f | | main.rs:126:9:126:9 | f | main.rs:117:5:119:5 | fn f | @@ -278,234 +278,262 @@ resolvePath | main.rs:503:13:503:17 | ...::f | main.rs:489:11:493:9 | fn f | | main.rs:504:20:504:23 | Self | main.rs:484:5:484:14 | struct S2 | | main.rs:504:20:504:34 | ...::AssocType | main.rs:497:26:499:9 | type AssocType | -| main.rs:521:14:521:16 | Foo | main.rs:511:9:513:9 | trait Foo | -| main.rs:521:22:521:22 | X | main.rs:519:9:519:21 | struct X | -| main.rs:523:17:523:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:527:14:527:16 | Bar | main.rs:515:9:517:9 | trait Bar | -| main.rs:527:22:527:22 | X | main.rs:519:9:519:21 | struct X | -| main.rs:529:17:529:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:534:9:534:9 | m | main.rs:510:5:532:5 | mod m | -| main.rs:534:9:534:12 | ...::X | main.rs:519:9:519:21 | struct X | -| main.rs:537:17:537:17 | X | main.rs:519:9:519:21 | struct X | -| main.rs:540:17:540:17 | m | main.rs:510:5:532:5 | mod m | -| main.rs:540:17:540:22 | ...::Foo | main.rs:511:9:513:9 | trait Foo | -| main.rs:541:13:541:13 | X | main.rs:519:9:519:21 | struct X | -| main.rs:541:13:541:23 | ...::a_method | main.rs:521:26:524:13 | fn a_method | -| main.rs:545:17:545:17 | m | main.rs:510:5:532:5 | mod m | -| main.rs:545:17:545:22 | ...::Bar | main.rs:515:9:517:9 | trait Bar | -| main.rs:546:13:546:13 | X | main.rs:519:9:519:21 | struct X | -| main.rs:546:13:546:23 | ...::a_method | main.rs:527:26:530:13 | fn a_method | -| main.rs:550:17:550:17 | m | main.rs:510:5:532:5 | mod m | -| main.rs:550:17:550:22 | ...::Bar | main.rs:515:9:517:9 | trait Bar | -| main.rs:551:13:551:13 | X | main.rs:519:9:519:21 | struct X | -| main.rs:551:13:551:23 | ...::a_method | main.rs:527:26:530:13 | fn a_method | -| main.rs:556:13:556:13 | m | main.rs:510:5:532:5 | mod m | -| main.rs:556:13:556:18 | ...::Bar | main.rs:515:9:517:9 | trait Bar | -| main.rs:556:13:556:28 | ...::a_method | main.rs:516:13:516:31 | fn a_method | -| main.rs:569:10:569:16 | MyTrait | main.rs:562:5:564:5 | trait MyTrait | -| main.rs:570:9:570:9 | S | main.rs:566:5:566:13 | struct S | -| main.rs:572:13:572:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:578:7:578:13 | MyTrait | main.rs:562:5:564:5 | trait MyTrait | -| main.rs:579:10:579:10 | T | main.rs:577:10:577:10 | T | -| main.rs:581:9:581:9 | T | main.rs:577:10:577:10 | T | -| main.rs:581:9:581:12 | ...::f | main.rs:563:9:563:20 | fn f | -| main.rs:582:9:582:15 | MyTrait | main.rs:562:5:564:5 | trait MyTrait | -| main.rs:582:9:582:18 | ...::f | main.rs:563:9:563:20 | fn f | -| main.rs:587:9:587:9 | g | main.rs:576:5:583:5 | fn g | -| main.rs:588:11:588:11 | S | main.rs:566:5:566:13 | struct S | -| main.rs:595:9:595:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:600:13:600:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:605:17:605:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:606:17:606:21 | super | main.rs:598:5:610:5 | mod m19 | -| main.rs:606:17:606:24 | ...::f | main.rs:599:9:601:9 | fn f | -| main.rs:607:17:607:21 | super | main.rs:598:5:610:5 | mod m19 | -| main.rs:607:17:607:28 | ...::super | main.rs:593:1:611:1 | mod m18 | -| main.rs:607:17:607:31 | ...::f | main.rs:594:5:596:5 | fn f | -| main.rs:624:13:624:17 | super | main.rs:613:1:638:1 | mod m21 | -| main.rs:624:13:624:22 | ...::m22 | main.rs:614:5:620:5 | mod m22 | -| main.rs:624:13:624:30 | ...::MyEnum | main.rs:615:9:617:9 | enum MyEnum | -| main.rs:625:13:625:16 | self | main.rs:615:9:617:9 | enum MyEnum | -| main.rs:629:13:629:17 | super | main.rs:613:1:638:1 | mod m21 | -| main.rs:629:13:629:22 | ...::m22 | main.rs:614:5:620:5 | mod m22 | -| main.rs:629:13:629:32 | ...::MyStruct | main.rs:619:9:619:28 | struct MyStruct | -| main.rs:630:13:630:16 | self | main.rs:619:9:619:28 | struct MyStruct | -| main.rs:634:21:634:26 | MyEnum | main.rs:615:9:617:9 | enum MyEnum | -| main.rs:634:21:634:29 | ...::A | main.rs:616:13:616:13 | A | -| main.rs:635:21:635:28 | MyStruct | main.rs:619:9:619:28 | struct MyStruct | -| main.rs:651:10:653:5 | Trait1::<...> | main.rs:641:5:646:5 | trait Trait1 | -| main.rs:652:7:652:10 | Self | main.rs:648:5:648:13 | struct S | -| main.rs:654:11:654:11 | S | main.rs:648:5:648:13 | struct S | -| main.rs:656:13:656:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:662:17:662:17 | S | main.rs:648:5:648:13 | struct S | -| main.rs:678:15:678:15 | T | main.rs:677:26:677:26 | T | -| main.rs:683:9:683:24 | GenericStruct::<...> | main.rs:676:5:679:5 | struct GenericStruct | -| main.rs:683:23:683:23 | T | main.rs:682:10:682:10 | T | -| main.rs:685:9:685:9 | T | main.rs:682:10:682:10 | T | -| main.rs:685:12:685:17 | TraitA | main.rs:668:5:670:5 | trait TraitA | -| main.rs:694:9:694:24 | GenericStruct::<...> | main.rs:676:5:679:5 | struct GenericStruct | -| main.rs:694:23:694:23 | T | main.rs:693:10:693:10 | T | -| main.rs:696:9:696:9 | T | main.rs:693:10:693:10 | T | -| main.rs:696:12:696:17 | TraitB | main.rs:672:5:674:5 | trait TraitB | -| main.rs:697:9:697:9 | T | main.rs:693:10:693:10 | T | -| main.rs:697:12:697:17 | TraitA | main.rs:668:5:670:5 | trait TraitA | -| main.rs:708:10:708:15 | TraitA | main.rs:668:5:670:5 | trait TraitA | -| main.rs:708:21:708:31 | Implementor | main.rs:705:5:705:23 | struct Implementor | -| main.rs:710:13:710:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:715:10:715:15 | TraitB | main.rs:672:5:674:5 | trait TraitB | -| main.rs:715:21:715:31 | Implementor | main.rs:705:5:705:23 | struct Implementor | -| main.rs:717:13:717:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:723:24:723:34 | Implementor | main.rs:705:5:705:23 | struct Implementor | -| main.rs:724:23:724:35 | GenericStruct | main.rs:676:5:679:5 | struct GenericStruct | -| main.rs:730:9:730:36 | GenericStruct::<...> | main.rs:676:5:679:5 | struct GenericStruct | -| main.rs:730:9:730:50 | ...::call_trait_a | main.rs:687:9:689:9 | fn call_trait_a | -| main.rs:730:25:730:35 | Implementor | main.rs:705:5:705:23 | struct Implementor | -| main.rs:733:9:733:36 | GenericStruct::<...> | main.rs:676:5:679:5 | struct GenericStruct | -| main.rs:733:9:733:47 | ...::call_both | main.rs:699:9:702:9 | fn call_both | -| main.rs:733:25:733:35 | Implementor | main.rs:705:5:705:23 | struct Implementor | -| main.rs:739:3:739:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:739:3:739:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:743:6:743:12 | AStruct | main.rs:742:1:742:17 | struct AStruct | -| main.rs:745:7:745:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:745:7:745:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:748:7:748:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:748:7:748:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:753:9:753:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:753:9:753:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | -| main.rs:753:9:753:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:754:9:754:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:754:9:754:19 | ...::result | {EXTERNAL LOCATION} | mod result | -| main.rs:754:9:754:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | -| main.rs:762:19:762:22 | Self | main.rs:756:5:764:5 | trait Reduce | -| main.rs:762:19:762:29 | ...::Input | main.rs:757:9:757:19 | type Input | -| main.rs:763:14:763:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:763:21:763:24 | Self | main.rs:756:5:764:5 | trait Reduce | -| main.rs:763:21:763:32 | ...::Output | main.rs:758:21:759:20 | type Output | -| main.rs:763:35:763:38 | Self | main.rs:756:5:764:5 | trait Reduce | -| main.rs:763:35:763:45 | ...::Error | main.rs:757:21:758:19 | type Error | -| main.rs:767:17:767:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:767:29:767:33 | Input | main.rs:766:19:766:23 | Input | -| main.rs:768:17:768:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:768:29:768:33 | Error | main.rs:766:26:766:30 | Error | -| main.rs:775:11:775:16 | Reduce | main.rs:756:5:764:5 | trait Reduce | -| main.rs:776:13:779:9 | MyImpl::<...> | main.rs:766:5:769:5 | struct MyImpl | -| main.rs:777:13:777:17 | Input | main.rs:773:13:773:17 | Input | -| main.rs:778:13:778:17 | Error | main.rs:774:13:774:17 | Error | -| main.rs:781:22:784:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:782:13:782:17 | Input | main.rs:773:13:773:17 | Input | -| main.rs:783:13:783:16 | Self | main.rs:766:5:769:5 | struct MyImpl | -| main.rs:783:13:783:23 | ...::Error | main.rs:785:11:789:9 | type Error | -| main.rs:786:22:788:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:787:11:787:15 | Error | main.rs:774:13:774:17 | Error | -| main.rs:791:13:791:17 | Input | main.rs:773:13:773:17 | Input | -| main.rs:796:19:796:22 | Self | main.rs:766:5:769:5 | struct MyImpl | -| main.rs:796:19:796:29 | ...::Input | main.rs:781:9:785:9 | type Input | -| main.rs:797:14:800:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:798:13:798:16 | Self | main.rs:766:5:769:5 | struct MyImpl | -| main.rs:798:13:798:24 | ...::Output | main.rs:789:11:792:9 | type Output | -| main.rs:799:13:799:16 | Self | main.rs:766:5:769:5 | struct MyImpl | -| main.rs:799:13:799:23 | ...::Error | main.rs:785:11:789:9 | type Error | -| main.rs:806:5:806:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:806:11:806:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:808:15:808:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:808:15:808:25 | ...::string | {EXTERNAL LOCATION} | mod string | -| main.rs:808:15:808:33 | ...::String | {EXTERNAL LOCATION} | struct String | -| main.rs:818:7:818:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:818:7:818:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | -| main.rs:819:10:819:15 | ATrait | main.rs:814:5:816:5 | trait ATrait | -| main.rs:819:21:819:23 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:821:11:821:13 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:827:17:827:19 | Foo | main.rs:812:5:812:15 | struct Foo | -| main.rs:833:22:833:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:833:29:833:31 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:834:17:834:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:835:17:835:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:835:24:835:26 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:836:13:836:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:837:17:837:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:839:13:839:16 | None | {EXTERNAL LOCATION} | None | -| main.rs:840:17:840:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:849:19:849:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:849:26:849:28 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:850:26:850:29 | test | main.rs:832:5:846:5 | fn test | -| main.rs:856:14:856:16 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:861:17:861:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:863:13:863:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:868:13:868:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:868:18:868:18 | z | main.rs:855:5:857:12 | Const | -| main.rs:868:24:868:24 | z | main.rs:855:5:857:12 | Const | -| main.rs:875:5:875:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:875:5:875:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:875:5:875:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:875:5:875:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:875:5:875:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:876:5:876:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:876:5:876:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:877:5:877:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:877:5:877:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:877:5:877:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:877:5:877:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:878:5:878:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:879:5:879:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:880:5:880:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:880:5:880:12 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:881:5:881:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:881:5:881:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:881:5:881:13 | ...::g | main.rs:30:9:34:9 | fn g | -| main.rs:882:5:882:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:882:5:882:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:882:5:882:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | -| main.rs:882:5:882:17 | ...::h | main.rs:37:27:41:13 | fn h | -| main.rs:883:5:883:6 | m4 | main.rs:46:1:53:1 | mod m4 | -| main.rs:883:5:883:9 | ...::i | main.rs:49:5:52:5 | fn i | -| main.rs:884:5:884:5 | h | main.rs:57:1:76:1 | fn h | -| main.rs:885:5:885:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:886:5:886:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:887:5:887:5 | j | main.rs:104:1:108:1 | fn j | -| main.rs:888:5:888:6 | m6 | main.rs:116:1:128:1 | mod m6 | -| main.rs:888:5:888:9 | ...::g | main.rs:121:5:127:5 | fn g | -| main.rs:889:5:889:6 | m7 | main.rs:130:1:149:1 | mod m7 | -| main.rs:889:5:889:9 | ...::f | main.rs:141:5:148:5 | fn f | -| main.rs:890:5:890:6 | m8 | main.rs:151:1:205:1 | mod m8 | -| main.rs:890:5:890:9 | ...::g | main.rs:189:5:204:5 | fn g | -| main.rs:891:5:891:6 | m9 | main.rs:207:1:215:1 | mod m9 | -| main.rs:891:5:891:9 | ...::f | main.rs:210:5:214:5 | fn f | -| main.rs:892:5:892:7 | m11 | main.rs:238:1:275:1 | mod m11 | -| main.rs:892:5:892:10 | ...::f | main.rs:243:5:246:5 | fn f | -| main.rs:893:5:893:7 | m15 | main.rs:306:1:375:1 | mod m15 | -| main.rs:893:5:893:10 | ...::f | main.rs:362:5:374:5 | fn f | -| main.rs:894:5:894:7 | m16 | main.rs:377:1:507:1 | mod m16 | -| main.rs:894:5:894:10 | ...::f | main.rs:446:5:470:5 | fn f | -| main.rs:895:5:895:20 | trait_visibility | main.rs:509:1:559:1 | mod trait_visibility | -| main.rs:895:5:895:23 | ...::f | main.rs:536:5:558:5 | fn f | -| main.rs:896:5:896:7 | m17 | main.rs:561:1:591:1 | mod m17 | -| main.rs:896:5:896:10 | ...::f | main.rs:585:5:590:5 | fn f | -| main.rs:897:5:897:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:897:5:897:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:898:5:898:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:898:5:898:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:899:5:899:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | -| main.rs:899:5:899:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:900:5:900:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:901:5:901:12 | my_alias | main.rs:1:1:1:7 | mod my | -| main.rs:901:5:901:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:902:5:902:7 | m18 | main.rs:593:1:611:1 | mod m18 | -| main.rs:902:5:902:12 | ...::m19 | main.rs:598:5:610:5 | mod m19 | -| main.rs:902:5:902:17 | ...::m20 | main.rs:603:9:609:9 | mod m20 | -| main.rs:902:5:902:20 | ...::g | main.rs:604:13:608:13 | fn g | -| main.rs:903:5:903:7 | m23 | main.rs:640:1:665:1 | mod m23 | -| main.rs:903:5:903:10 | ...::f | main.rs:660:5:664:5 | fn f | -| main.rs:904:5:904:7 | m24 | main.rs:667:1:735:1 | mod m24 | -| main.rs:904:5:904:10 | ...::f | main.rs:721:5:734:5 | fn f | -| main.rs:905:5:905:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:905:5:905:11 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:906:5:906:13 | z_changed | main.rs:740:1:740:9 | fn z_changed | -| main.rs:907:5:907:11 | AStruct | main.rs:742:1:742:17 | struct AStruct | -| main.rs:907:5:907:22 | ...::z_on_type | main.rs:746:5:746:17 | fn z_on_type | -| main.rs:908:5:908:11 | AStruct | main.rs:742:1:742:17 | struct AStruct | -| main.rs:909:5:909:29 | impl_with_attribute_macro | main.rs:810:1:829:1 | mod impl_with_attribute_macro | -| main.rs:909:5:909:35 | ...::test | main.rs:825:5:828:5 | fn test | -| main.rs:910:5:910:12 | patterns | main.rs:831:1:872:1 | mod patterns | -| main.rs:910:5:910:18 | ...::test | main.rs:832:5:846:5 | fn test | +| main.rs:511:23:511:26 | Self | main.rs:508:5:512:5 | trait Trait5 | +| main.rs:511:23:511:33 | ...::Assoc | main.rs:509:9:509:19 | type Assoc | +| main.rs:515:10:515:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 | +| main.rs:515:21:515:21 | S | main.rs:412:5:412:13 | struct S | +| main.rs:516:22:516:24 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:520:16:520:19 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:520:16:520:26 | ...::Assoc | main.rs:515:25:517:9 | type Assoc | +| main.rs:521:13:521:16 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:521:13:521:23 | ...::Assoc | main.rs:519:9:522:9 | fn Assoc | +| main.rs:525:19:525:20 | T3 | main.rs:525:15:525:16 | T3 | +| main.rs:528:10:528:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 | +| main.rs:528:21:528:27 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:528:24:528:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:529:22:529:24 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:533:16:533:19 | Self | main.rs:525:5:525:22 | struct S3 | +| main.rs:533:16:533:26 | ...::Assoc | main.rs:528:31:530:9 | type Assoc | +| main.rs:534:13:534:16 | Self | main.rs:525:5:525:22 | struct S3 | +| main.rs:534:13:534:23 | ...::Assoc | main.rs:532:9:535:9 | fn Assoc | +| main.rs:534:13:534:23 | ...::Assoc | main.rs:543:9:546:9 | fn Assoc | +| main.rs:539:10:539:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 | +| main.rs:539:21:539:28 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:539:24:539:27 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:540:22:540:25 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:544:16:544:19 | Self | main.rs:525:5:525:22 | struct S3 | +| main.rs:544:16:544:26 | ...::Assoc | main.rs:539:32:541:9 | type Assoc | +| main.rs:545:14:545:17 | Self | main.rs:525:5:525:22 | struct S3 | +| main.rs:545:14:545:24 | ...::Assoc | main.rs:532:9:535:9 | fn Assoc | +| main.rs:545:14:545:24 | ...::Assoc | main.rs:543:9:546:9 | fn Assoc | +| main.rs:562:14:562:16 | Foo | main.rs:552:9:554:9 | trait Foo | +| main.rs:562:22:562:22 | X | main.rs:560:9:560:21 | struct X | +| main.rs:564:17:564:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:568:14:568:16 | Bar | main.rs:556:9:558:9 | trait Bar | +| main.rs:568:22:568:22 | X | main.rs:560:9:560:21 | struct X | +| main.rs:570:17:570:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:575:9:575:9 | m | main.rs:551:5:573:5 | mod m | +| main.rs:575:9:575:12 | ...::X | main.rs:560:9:560:21 | struct X | +| main.rs:578:17:578:17 | X | main.rs:560:9:560:21 | struct X | +| main.rs:581:17:581:17 | m | main.rs:551:5:573:5 | mod m | +| main.rs:581:17:581:22 | ...::Foo | main.rs:552:9:554:9 | trait Foo | +| main.rs:582:13:582:13 | X | main.rs:560:9:560:21 | struct X | +| main.rs:582:13:582:23 | ...::a_method | main.rs:562:26:565:13 | fn a_method | +| main.rs:586:17:586:17 | m | main.rs:551:5:573:5 | mod m | +| main.rs:586:17:586:22 | ...::Bar | main.rs:556:9:558:9 | trait Bar | +| main.rs:587:13:587:13 | X | main.rs:560:9:560:21 | struct X | +| main.rs:587:13:587:23 | ...::a_method | main.rs:568:26:571:13 | fn a_method | +| main.rs:591:17:591:17 | m | main.rs:551:5:573:5 | mod m | +| main.rs:591:17:591:22 | ...::Bar | main.rs:556:9:558:9 | trait Bar | +| main.rs:592:13:592:13 | X | main.rs:560:9:560:21 | struct X | +| main.rs:592:13:592:23 | ...::a_method | main.rs:568:26:571:13 | fn a_method | +| main.rs:597:13:597:13 | m | main.rs:551:5:573:5 | mod m | +| main.rs:597:13:597:18 | ...::Bar | main.rs:556:9:558:9 | trait Bar | +| main.rs:597:13:597:28 | ...::a_method | main.rs:557:13:557:31 | fn a_method | +| main.rs:610:10:610:16 | MyTrait | main.rs:603:5:605:5 | trait MyTrait | +| main.rs:611:9:611:9 | S | main.rs:607:5:607:13 | struct S | +| main.rs:613:13:613:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:619:7:619:13 | MyTrait | main.rs:603:5:605:5 | trait MyTrait | +| main.rs:620:10:620:10 | T | main.rs:618:10:618:10 | T | +| main.rs:622:9:622:9 | T | main.rs:618:10:618:10 | T | +| main.rs:622:9:622:12 | ...::f | main.rs:604:9:604:20 | fn f | +| main.rs:623:9:623:15 | MyTrait | main.rs:603:5:605:5 | trait MyTrait | +| main.rs:623:9:623:18 | ...::f | main.rs:604:9:604:20 | fn f | +| main.rs:628:9:628:9 | g | main.rs:617:5:624:5 | fn g | +| main.rs:629:11:629:11 | S | main.rs:607:5:607:13 | struct S | +| main.rs:636:9:636:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:641:13:641:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:646:17:646:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:647:17:647:21 | super | main.rs:639:5:651:5 | mod m19 | +| main.rs:647:17:647:24 | ...::f | main.rs:640:9:642:9 | fn f | +| main.rs:648:17:648:21 | super | main.rs:639:5:651:5 | mod m19 | +| main.rs:648:17:648:28 | ...::super | main.rs:634:1:652:1 | mod m18 | +| main.rs:648:17:648:31 | ...::f | main.rs:635:5:637:5 | fn f | +| main.rs:665:13:665:17 | super | main.rs:654:1:679:1 | mod m21 | +| main.rs:665:13:665:22 | ...::m22 | main.rs:655:5:661:5 | mod m22 | +| main.rs:665:13:665:30 | ...::MyEnum | main.rs:656:9:658:9 | enum MyEnum | +| main.rs:666:13:666:16 | self | main.rs:656:9:658:9 | enum MyEnum | +| main.rs:670:13:670:17 | super | main.rs:654:1:679:1 | mod m21 | +| main.rs:670:13:670:22 | ...::m22 | main.rs:655:5:661:5 | mod m22 | +| main.rs:670:13:670:32 | ...::MyStruct | main.rs:660:9:660:28 | struct MyStruct | +| main.rs:671:13:671:16 | self | main.rs:660:9:660:28 | struct MyStruct | +| main.rs:675:21:675:26 | MyEnum | main.rs:656:9:658:9 | enum MyEnum | +| main.rs:675:21:675:29 | ...::A | main.rs:657:13:657:13 | A | +| main.rs:676:21:676:28 | MyStruct | main.rs:660:9:660:28 | struct MyStruct | +| main.rs:692:10:694:5 | Trait1::<...> | main.rs:682:5:687:5 | trait Trait1 | +| main.rs:693:7:693:10 | Self | main.rs:689:5:689:13 | struct S | +| main.rs:695:11:695:11 | S | main.rs:689:5:689:13 | struct S | +| main.rs:697:13:697:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:703:17:703:17 | S | main.rs:689:5:689:13 | struct S | +| main.rs:719:15:719:15 | T | main.rs:718:26:718:26 | T | +| main.rs:724:9:724:24 | GenericStruct::<...> | main.rs:717:5:720:5 | struct GenericStruct | +| main.rs:724:23:724:23 | T | main.rs:723:10:723:10 | T | +| main.rs:726:9:726:9 | T | main.rs:723:10:723:10 | T | +| main.rs:726:12:726:17 | TraitA | main.rs:709:5:711:5 | trait TraitA | +| main.rs:735:9:735:24 | GenericStruct::<...> | main.rs:717:5:720:5 | struct GenericStruct | +| main.rs:735:23:735:23 | T | main.rs:734:10:734:10 | T | +| main.rs:737:9:737:9 | T | main.rs:734:10:734:10 | T | +| main.rs:737:12:737:17 | TraitB | main.rs:713:5:715:5 | trait TraitB | +| main.rs:738:9:738:9 | T | main.rs:734:10:734:10 | T | +| main.rs:738:12:738:17 | TraitA | main.rs:709:5:711:5 | trait TraitA | +| main.rs:749:10:749:15 | TraitA | main.rs:709:5:711:5 | trait TraitA | +| main.rs:749:21:749:31 | Implementor | main.rs:746:5:746:23 | struct Implementor | +| main.rs:751:13:751:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:756:10:756:15 | TraitB | main.rs:713:5:715:5 | trait TraitB | +| main.rs:756:21:756:31 | Implementor | main.rs:746:5:746:23 | struct Implementor | +| main.rs:758:13:758:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:764:24:764:34 | Implementor | main.rs:746:5:746:23 | struct Implementor | +| main.rs:765:23:765:35 | GenericStruct | main.rs:717:5:720:5 | struct GenericStruct | +| main.rs:771:9:771:36 | GenericStruct::<...> | main.rs:717:5:720:5 | struct GenericStruct | +| main.rs:771:9:771:50 | ...::call_trait_a | main.rs:728:9:730:9 | fn call_trait_a | +| main.rs:771:25:771:35 | Implementor | main.rs:746:5:746:23 | struct Implementor | +| main.rs:774:9:774:36 | GenericStruct::<...> | main.rs:717:5:720:5 | struct GenericStruct | +| main.rs:774:9:774:47 | ...::call_both | main.rs:740:9:743:9 | fn call_both | +| main.rs:774:25:774:35 | Implementor | main.rs:746:5:746:23 | struct Implementor | +| main.rs:780:3:780:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:780:3:780:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:784:6:784:12 | AStruct | main.rs:783:1:783:17 | struct AStruct | +| main.rs:786:7:786:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:786:7:786:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:789:7:789:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:789:7:789:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:794:9:794:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:794:9:794:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | +| main.rs:794:9:794:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:795:9:795:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:795:9:795:19 | ...::result | {EXTERNAL LOCATION} | mod result | +| main.rs:795:9:795:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | +| main.rs:803:19:803:22 | Self | main.rs:797:5:805:5 | trait Reduce | +| main.rs:803:19:803:29 | ...::Input | main.rs:798:9:798:19 | type Input | +| main.rs:804:14:804:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:804:21:804:24 | Self | main.rs:797:5:805:5 | trait Reduce | +| main.rs:804:21:804:32 | ...::Output | main.rs:799:21:800:20 | type Output | +| main.rs:804:35:804:38 | Self | main.rs:797:5:805:5 | trait Reduce | +| main.rs:804:35:804:45 | ...::Error | main.rs:798:21:799:19 | type Error | +| main.rs:808:17:808:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:808:29:808:33 | Input | main.rs:807:19:807:23 | Input | +| main.rs:809:17:809:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:809:29:809:33 | Error | main.rs:807:26:807:30 | Error | +| main.rs:816:11:816:16 | Reduce | main.rs:797:5:805:5 | trait Reduce | +| main.rs:817:13:820:9 | MyImpl::<...> | main.rs:807:5:810:5 | struct MyImpl | +| main.rs:818:13:818:17 | Input | main.rs:814:13:814:17 | Input | +| main.rs:819:13:819:17 | Error | main.rs:815:13:815:17 | Error | +| main.rs:822:22:825:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:823:13:823:17 | Input | main.rs:814:13:814:17 | Input | +| main.rs:824:13:824:16 | Self | main.rs:807:5:810:5 | struct MyImpl | +| main.rs:824:13:824:23 | ...::Error | main.rs:826:11:830:9 | type Error | +| main.rs:827:22:829:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:828:11:828:15 | Error | main.rs:815:13:815:17 | Error | +| main.rs:832:13:832:17 | Input | main.rs:814:13:814:17 | Input | +| main.rs:837:19:837:22 | Self | main.rs:807:5:810:5 | struct MyImpl | +| main.rs:837:19:837:29 | ...::Input | main.rs:822:9:826:9 | type Input | +| main.rs:838:14:841:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:839:13:839:16 | Self | main.rs:807:5:810:5 | struct MyImpl | +| main.rs:839:13:839:24 | ...::Output | main.rs:830:11:833:9 | type Output | +| main.rs:840:13:840:16 | Self | main.rs:807:5:810:5 | struct MyImpl | +| main.rs:840:13:840:23 | ...::Error | main.rs:826:11:830:9 | type Error | +| main.rs:847:5:847:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:847:11:847:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:849:15:849:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:849:15:849:25 | ...::string | {EXTERNAL LOCATION} | mod string | +| main.rs:849:15:849:33 | ...::String | {EXTERNAL LOCATION} | struct String | +| main.rs:859:7:859:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:859:7:859:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | +| main.rs:860:10:860:15 | ATrait | main.rs:855:5:857:5 | trait ATrait | +| main.rs:860:21:860:23 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:862:11:862:13 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:868:17:868:19 | Foo | main.rs:853:5:853:15 | struct Foo | +| main.rs:874:22:874:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:874:29:874:31 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:875:17:875:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:876:17:876:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:876:24:876:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:877:13:877:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:878:17:878:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:880:13:880:16 | None | {EXTERNAL LOCATION} | None | +| main.rs:881:17:881:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:890:19:890:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:890:26:890:28 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:891:26:891:29 | test | main.rs:873:5:887:5 | fn test | +| main.rs:897:14:897:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:902:17:902:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:904:13:904:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:909:13:909:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:909:18:909:18 | z | main.rs:896:5:898:12 | Const | +| main.rs:909:24:909:24 | z | main.rs:896:5:898:12 | Const | +| main.rs:916:5:916:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:916:5:916:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:916:5:916:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:916:5:916:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:916:5:916:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:917:5:917:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:917:5:917:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:918:5:918:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:918:5:918:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:918:5:918:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:918:5:918:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:919:5:919:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:920:5:920:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:921:5:921:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:921:5:921:12 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:922:5:922:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:922:5:922:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:922:5:922:13 | ...::g | main.rs:30:9:34:9 | fn g | +| main.rs:923:5:923:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:923:5:923:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:923:5:923:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | +| main.rs:923:5:923:17 | ...::h | main.rs:37:27:41:13 | fn h | +| main.rs:924:5:924:6 | m4 | main.rs:46:1:53:1 | mod m4 | +| main.rs:924:5:924:9 | ...::i | main.rs:49:5:52:5 | fn i | +| main.rs:925:5:925:5 | h | main.rs:57:1:76:1 | fn h | +| main.rs:926:5:926:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:927:5:927:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:928:5:928:5 | j | main.rs:104:1:108:1 | fn j | +| main.rs:929:5:929:6 | m6 | main.rs:116:1:128:1 | mod m6 | +| main.rs:929:5:929:9 | ...::g | main.rs:121:5:127:5 | fn g | +| main.rs:930:5:930:6 | m7 | main.rs:130:1:149:1 | mod m7 | +| main.rs:930:5:930:9 | ...::f | main.rs:141:5:148:5 | fn f | +| main.rs:931:5:931:6 | m8 | main.rs:151:1:205:1 | mod m8 | +| main.rs:931:5:931:9 | ...::g | main.rs:189:5:204:5 | fn g | +| main.rs:932:5:932:6 | m9 | main.rs:207:1:215:1 | mod m9 | +| main.rs:932:5:932:9 | ...::f | main.rs:210:5:214:5 | fn f | +| main.rs:933:5:933:7 | m11 | main.rs:238:1:275:1 | mod m11 | +| main.rs:933:5:933:10 | ...::f | main.rs:243:5:246:5 | fn f | +| main.rs:934:5:934:7 | m15 | main.rs:306:1:375:1 | mod m15 | +| main.rs:934:5:934:10 | ...::f | main.rs:362:5:374:5 | fn f | +| main.rs:935:5:935:7 | m16 | main.rs:377:1:548:1 | mod m16 | +| main.rs:935:5:935:10 | ...::f | main.rs:446:5:470:5 | fn f | +| main.rs:936:5:936:20 | trait_visibility | main.rs:550:1:600:1 | mod trait_visibility | +| main.rs:936:5:936:23 | ...::f | main.rs:577:5:599:5 | fn f | +| main.rs:937:5:937:7 | m17 | main.rs:602:1:632:1 | mod m17 | +| main.rs:937:5:937:10 | ...::f | main.rs:626:5:631:5 | fn f | +| main.rs:938:5:938:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:938:5:938:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:939:5:939:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:939:5:939:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:940:5:940:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | +| main.rs:940:5:940:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:941:5:941:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:942:5:942:12 | my_alias | main.rs:1:1:1:7 | mod my | +| main.rs:942:5:942:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:943:5:943:7 | m18 | main.rs:634:1:652:1 | mod m18 | +| main.rs:943:5:943:12 | ...::m19 | main.rs:639:5:651:5 | mod m19 | +| main.rs:943:5:943:17 | ...::m20 | main.rs:644:9:650:9 | mod m20 | +| main.rs:943:5:943:20 | ...::g | main.rs:645:13:649:13 | fn g | +| main.rs:944:5:944:7 | m23 | main.rs:681:1:706:1 | mod m23 | +| main.rs:944:5:944:10 | ...::f | main.rs:701:5:705:5 | fn f | +| main.rs:945:5:945:7 | m24 | main.rs:708:1:776:1 | mod m24 | +| main.rs:945:5:945:10 | ...::f | main.rs:762:5:775:5 | fn f | +| main.rs:946:5:946:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:946:5:946:11 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:947:5:947:13 | z_changed | main.rs:781:1:781:9 | fn z_changed | +| main.rs:948:5:948:11 | AStruct | main.rs:783:1:783:17 | struct AStruct | +| main.rs:948:5:948:22 | ...::z_on_type | main.rs:787:5:787:17 | fn z_on_type | +| main.rs:949:5:949:11 | AStruct | main.rs:783:1:783:17 | struct AStruct | +| main.rs:950:5:950:29 | impl_with_attribute_macro | main.rs:851:1:870:1 | mod impl_with_attribute_macro | +| main.rs:950:5:950:35 | ...::test | main.rs:866:5:869:5 | fn test | +| main.rs:951:5:951:12 | patterns | main.rs:872:1:913:1 | mod patterns | +| main.rs:951:5:951:18 | ...::test | main.rs:873:5:887:5 | fn test | | my2/mod.rs:4:5:4:11 | println | {EXTERNAL LOCATION} | MacroRules | | 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 | @@ -531,7 +559,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:57:1:76:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:911:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:952:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:57:1:76:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | From 34f3892c35ad101d5bf5352db20d8a7b7652550d Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 1 Dec 2025 09:58:27 +0100 Subject: [PATCH 7/8] Rust: Extend `Self` resolution logic to all item kinds --- .../codeql/rust/internal/PathResolution.qll | 18 +++++++----------- .../PathResolutionConsistency.expected | 2 -- .../test/library-tests/path-resolution/main.rs | 4 ++-- .../path-resolution/path-resolution.expected | 2 -- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 9503b4304d33..896faa8dccce 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1896,10 +1896,11 @@ private predicate isImplSelfQualifiedPath( name = path.getText() } -private TypeAliasItemNode resolveSelfAssocType(PathExt qualifier, PathExt path) { +private ItemNode resolveImplSelfQualified(PathExt qualifier, PathExt path, Namespace ns) { exists(ImplItemNode impl, string name | isImplSelfQualifiedPath(impl, qualifier, path, name) and - result = impl.getAssocItem(name) + result = impl.getAssocItem(name) and + ns = result.getNamespace() ) } @@ -1909,17 +1910,12 @@ private TypeAliasItemNode resolveSelfAssocType(PathExt qualifier, PathExt path) */ pragma[nomagic] private ItemNode resolvePathCandQualified(PathExt qualifier, ItemNode q, PathExt path, Namespace ns) { - // Special case for `Self::AssocType`; this always refers to the associated - // type in the enclosing `impl` block, if available. + // Special case for `Self::Assoc`; this always refers to the associated + // item in the enclosing `impl` block, if available. q = resolvePathCandQualifier(qualifier, path, _) and - ns.isType() and - result = resolveSelfAssocType(qualifier, path) + result = resolveImplSelfQualified(qualifier, path, ns) or - ( - not exists(resolveSelfAssocType(qualifier, path)) - or - not ns.isType() - ) and + not exists(resolveImplSelfQualified(qualifier, path, ns)) and exists(string name, SuccessorKind kind, UseOption useOpt | q = resolvePathCandQualifier(qualifier, path, name) and result = getASuccessor(q, name, ns, kind, useOpt) and diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 07d2f2ed6d0c..10da6bb9c375 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -4,5 +4,3 @@ multipleCallTargets | main.rs:369:9:371:16 | ...::f(...) | | main.rs:450:9:454:16 | ...::f(...) | | main.rs:455:9:459:16 | ...::f(...) | -| main.rs:534:13:534:25 | ...::Assoc(...) | -| main.rs:545:14:545:26 | ...::Assoc(...) | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 697826f760d7..e336b7b97ed6 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -531,7 +531,7 @@ mod m16 { fn Assoc() -> Self::Assoc { // $ item=S3i32AssocType - Self::Assoc() + 1 // $ item=S3i32AssocFunc $ SPURIOUS: item=S3boolAssocFunc + Self::Assoc() + 1 // $ item=S3i32AssocFunc } // S3i32AssocFunc } @@ -542,7 +542,7 @@ mod m16 { fn Assoc() -> Self::Assoc { // $ item=S3boolAssocType - !Self::Assoc() // $ item=S3boolAssocFunc $ SPURIOUS: item=S3i32AssocFunc + !Self::Assoc() // $ item=S3boolAssocFunc } // S3boolAssocFunc } } 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 c742850ba927..4544c009fc6c 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -296,7 +296,6 @@ resolvePath | main.rs:533:16:533:26 | ...::Assoc | main.rs:528:31:530:9 | type Assoc | | main.rs:534:13:534:16 | Self | main.rs:525:5:525:22 | struct S3 | | main.rs:534:13:534:23 | ...::Assoc | main.rs:532:9:535:9 | fn Assoc | -| main.rs:534:13:534:23 | ...::Assoc | main.rs:543:9:546:9 | fn Assoc | | main.rs:539:10:539:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 | | main.rs:539:21:539:28 | S3::<...> | main.rs:525:5:525:22 | struct S3 | | main.rs:539:24:539:27 | bool | {EXTERNAL LOCATION} | struct bool | @@ -304,7 +303,6 @@ resolvePath | main.rs:544:16:544:19 | Self | main.rs:525:5:525:22 | struct S3 | | main.rs:544:16:544:26 | ...::Assoc | main.rs:539:32:541:9 | type Assoc | | main.rs:545:14:545:17 | Self | main.rs:525:5:525:22 | struct S3 | -| main.rs:545:14:545:24 | ...::Assoc | main.rs:532:9:535:9 | fn Assoc | | main.rs:545:14:545:24 | ...::Assoc | main.rs:543:9:546:9 | fn Assoc | | main.rs:562:14:562:16 | Foo | main.rs:552:9:554:9 | trait Foo | | main.rs:562:22:562:22 | X | main.rs:560:9:560:21 | struct X | From d45f8f72369b59ed718990f3d81ddaa67061ed9d Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 1 Dec 2025 10:08:44 +0100 Subject: [PATCH 8/8] Rust: Document overlapping function resoltion with test cases --- .../PathResolutionConsistency.expected | 3 + .../library-tests/path-resolution/main.rs | 26 + .../path-resolution/path-resolution.expected | 512 +++++++++--------- 3 files changed, 294 insertions(+), 247 deletions(-) diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 10da6bb9c375..cc34dfd2b7d6 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -4,3 +4,6 @@ multipleCallTargets | main.rs:369:9:371:16 | ...::f(...) | | main.rs:450:9:454:16 | ...::f(...) | | main.rs:455:9:459:16 | ...::f(...) | +| main.rs:565:9:566:15 | ...::Assoc(...) | +| main.rs:568:9:569:12 | ...::f1(...) | +| main.rs:571:9:572:12 | ...::f1(...) | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index e336b7b97ed6..761e97fced1e 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -545,6 +545,32 @@ mod m16 { !Self::Assoc() // $ item=S3boolAssocFunc } // S3boolAssocFunc } + + #[rustfmt::skip] + impl S3 { // $ item=S3 item=i32 + fn f1() -> i32 { // $ item=i32 + 0 + } // S3i32f1 + } + + #[rustfmt::skip] + impl S3 { // $ item=S3 item=bool + fn f1() -> bool { // $ item=bool + true + } // S3boolf1 + } + + #[rustfmt::skip] + fn foo() { + S3:::: // $ item=i32 + Assoc(); // $ item=S3i32AssocFunc $ SPURIOUS: item=S3boolAssocFunc + + S3:::: // $ item=bool + f1(); // $ item=S3boolf1 $ SPURIOUS: item=S3i32f1 + + S3:::: // $ item=i32 + f1(); // $ item=S3i32f1 $ SPURIOUS: item=S3boolf1 + } } mod trait_visibility { 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 4544c009fc6c..c6bac60b4123 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -18,21 +18,21 @@ mod | main.rs:291:1:304:1 | mod m13 | | main.rs:295:5:303:5 | mod m14 | | main.rs:306:1:375:1 | mod m15 | -| main.rs:377:1:548:1 | mod m16 | -| main.rs:550:1:600:1 | mod trait_visibility | -| main.rs:551:5:573:5 | mod m | -| main.rs:602:1:632:1 | mod m17 | -| main.rs:634:1:652:1 | mod m18 | -| main.rs:639:5:651:5 | mod m19 | -| main.rs:644:9:650:9 | mod m20 | -| main.rs:654:1:679:1 | mod m21 | -| main.rs:655:5:661:5 | mod m22 | -| main.rs:663:5:678:5 | mod m33 | -| main.rs:681:1:706:1 | mod m23 | -| main.rs:708:1:776:1 | mod m24 | -| main.rs:793:1:845:1 | mod associated_types | -| main.rs:851:1:870:1 | mod impl_with_attribute_macro | -| main.rs:872:1:913:1 | mod patterns | +| main.rs:377:1:574:1 | mod m16 | +| main.rs:576:1:626:1 | mod trait_visibility | +| main.rs:577:5:599:5 | mod m | +| main.rs:628:1:658:1 | mod m17 | +| main.rs:660:1:678:1 | mod m18 | +| main.rs:665:5:677:5 | mod m19 | +| main.rs:670:9:676:9 | mod m20 | +| main.rs:680:1:705:1 | mod m21 | +| main.rs:681:5:687:5 | mod m22 | +| main.rs:689:5:704:5 | mod m33 | +| main.rs:707:1:732:1 | mod m23 | +| main.rs:734:1:802:1 | mod m24 | +| main.rs:819:1:871:1 | mod associated_types | +| main.rs:877:1:896:1 | mod impl_with_attribute_macro | +| main.rs:898:1:939:1 | mod patterns | | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:20:1:20:12 | mod my3 | | my2/mod.rs:22:1:23:10 | mod mymod | @@ -73,7 +73,7 @@ resolvePath | main.rs:37:17:37:24 | ...::f | main.rs:26:9:28:9 | fn f | | main.rs:39:17:39:23 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:40:17:40:17 | f | main.rs:26:9:28:9 | fn f | -| main.rs:47:9:47:13 | super | main.rs:1:1:952:2 | SourceFile | +| main.rs:47:9:47:13 | super | main.rs:1:1:978:2 | SourceFile | | main.rs:47:9:47:17 | ...::m1 | main.rs:20:1:44:1 | mod m1 | | main.rs:47:9:47:21 | ...::m2 | main.rs:25:5:43:5 | mod m2 | | main.rs:47:9:47:24 | ...::g | main.rs:30:9:34:9 | fn g | @@ -88,7 +88,7 @@ resolvePath | main.rs:68:17:68:19 | Foo | main.rs:66:9:66:21 | struct Foo | | main.rs:71:13:71:15 | Foo | main.rs:60:5:60:17 | struct Foo | | main.rs:73:5:73:5 | f | main.rs:62:5:69:5 | fn f | -| main.rs:75:5:75:8 | self | main.rs:1:1:952:2 | SourceFile | +| main.rs:75:5:75:8 | self | main.rs:1:1:978:2 | SourceFile | | main.rs:75:5:75:11 | ...::i | main.rs:78:1:90:1 | fn i | | main.rs:79:5:79:11 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:81:13:81:15 | Foo | main.rs:55:1:55:13 | struct Foo | @@ -110,7 +110,7 @@ resolvePath | main.rs:112:9:112:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:118:9:118:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:122:9:122:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:125:13:125:17 | super | main.rs:1:1:952:2 | SourceFile | +| main.rs:125:13:125:17 | super | main.rs:1:1:978:2 | SourceFile | | main.rs:125:13:125:21 | ...::m5 | main.rs:110:1:114:1 | mod m5 | | main.rs:126:9:126:9 | f | main.rs:111:5:113:5 | fn f | | main.rs:126:9:126:9 | f | main.rs:117:5:119:5 | fn f | @@ -304,234 +304,252 @@ resolvePath | main.rs:544:16:544:26 | ...::Assoc | main.rs:539:32:541:9 | type Assoc | | main.rs:545:14:545:17 | Self | main.rs:525:5:525:22 | struct S3 | | main.rs:545:14:545:24 | ...::Assoc | main.rs:543:9:546:9 | fn Assoc | -| main.rs:562:14:562:16 | Foo | main.rs:552:9:554:9 | trait Foo | -| main.rs:562:22:562:22 | X | main.rs:560:9:560:21 | struct X | -| main.rs:564:17:564:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:568:14:568:16 | Bar | main.rs:556:9:558:9 | trait Bar | -| main.rs:568:22:568:22 | X | main.rs:560:9:560:21 | struct X | -| main.rs:570:17:570:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:575:9:575:9 | m | main.rs:551:5:573:5 | mod m | -| main.rs:575:9:575:12 | ...::X | main.rs:560:9:560:21 | struct X | -| main.rs:578:17:578:17 | X | main.rs:560:9:560:21 | struct X | -| main.rs:581:17:581:17 | m | main.rs:551:5:573:5 | mod m | -| main.rs:581:17:581:22 | ...::Foo | main.rs:552:9:554:9 | trait Foo | -| main.rs:582:13:582:13 | X | main.rs:560:9:560:21 | struct X | -| main.rs:582:13:582:23 | ...::a_method | main.rs:562:26:565:13 | fn a_method | -| main.rs:586:17:586:17 | m | main.rs:551:5:573:5 | mod m | -| main.rs:586:17:586:22 | ...::Bar | main.rs:556:9:558:9 | trait Bar | -| main.rs:587:13:587:13 | X | main.rs:560:9:560:21 | struct X | -| main.rs:587:13:587:23 | ...::a_method | main.rs:568:26:571:13 | fn a_method | -| main.rs:591:17:591:17 | m | main.rs:551:5:573:5 | mod m | -| main.rs:591:17:591:22 | ...::Bar | main.rs:556:9:558:9 | trait Bar | -| main.rs:592:13:592:13 | X | main.rs:560:9:560:21 | struct X | -| main.rs:592:13:592:23 | ...::a_method | main.rs:568:26:571:13 | fn a_method | -| main.rs:597:13:597:13 | m | main.rs:551:5:573:5 | mod m | -| main.rs:597:13:597:18 | ...::Bar | main.rs:556:9:558:9 | trait Bar | -| main.rs:597:13:597:28 | ...::a_method | main.rs:557:13:557:31 | fn a_method | -| main.rs:610:10:610:16 | MyTrait | main.rs:603:5:605:5 | trait MyTrait | -| main.rs:611:9:611:9 | S | main.rs:607:5:607:13 | struct S | -| main.rs:613:13:613:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:619:7:619:13 | MyTrait | main.rs:603:5:605:5 | trait MyTrait | -| main.rs:620:10:620:10 | T | main.rs:618:10:618:10 | T | -| main.rs:622:9:622:9 | T | main.rs:618:10:618:10 | T | -| main.rs:622:9:622:12 | ...::f | main.rs:604:9:604:20 | fn f | -| main.rs:623:9:623:15 | MyTrait | main.rs:603:5:605:5 | trait MyTrait | -| main.rs:623:9:623:18 | ...::f | main.rs:604:9:604:20 | fn f | -| main.rs:628:9:628:9 | g | main.rs:617:5:624:5 | fn g | -| main.rs:629:11:629:11 | S | main.rs:607:5:607:13 | struct S | -| main.rs:636:9:636:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:641:13:641:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:646:17:646:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:647:17:647:21 | super | main.rs:639:5:651:5 | mod m19 | -| main.rs:647:17:647:24 | ...::f | main.rs:640:9:642:9 | fn f | -| main.rs:648:17:648:21 | super | main.rs:639:5:651:5 | mod m19 | -| main.rs:648:17:648:28 | ...::super | main.rs:634:1:652:1 | mod m18 | -| main.rs:648:17:648:31 | ...::f | main.rs:635:5:637:5 | fn f | -| main.rs:665:13:665:17 | super | main.rs:654:1:679:1 | mod m21 | -| main.rs:665:13:665:22 | ...::m22 | main.rs:655:5:661:5 | mod m22 | -| main.rs:665:13:665:30 | ...::MyEnum | main.rs:656:9:658:9 | enum MyEnum | -| main.rs:666:13:666:16 | self | main.rs:656:9:658:9 | enum MyEnum | -| main.rs:670:13:670:17 | super | main.rs:654:1:679:1 | mod m21 | -| main.rs:670:13:670:22 | ...::m22 | main.rs:655:5:661:5 | mod m22 | -| main.rs:670:13:670:32 | ...::MyStruct | main.rs:660:9:660:28 | struct MyStruct | -| main.rs:671:13:671:16 | self | main.rs:660:9:660:28 | struct MyStruct | -| main.rs:675:21:675:26 | MyEnum | main.rs:656:9:658:9 | enum MyEnum | -| main.rs:675:21:675:29 | ...::A | main.rs:657:13:657:13 | A | -| main.rs:676:21:676:28 | MyStruct | main.rs:660:9:660:28 | struct MyStruct | -| main.rs:692:10:694:5 | Trait1::<...> | main.rs:682:5:687:5 | trait Trait1 | -| main.rs:693:7:693:10 | Self | main.rs:689:5:689:13 | struct S | -| main.rs:695:11:695:11 | S | main.rs:689:5:689:13 | struct S | -| main.rs:697:13:697:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:703:17:703:17 | S | main.rs:689:5:689:13 | struct S | -| main.rs:719:15:719:15 | T | main.rs:718:26:718:26 | T | -| main.rs:724:9:724:24 | GenericStruct::<...> | main.rs:717:5:720:5 | struct GenericStruct | -| main.rs:724:23:724:23 | T | main.rs:723:10:723:10 | T | -| main.rs:726:9:726:9 | T | main.rs:723:10:723:10 | T | -| main.rs:726:12:726:17 | TraitA | main.rs:709:5:711:5 | trait TraitA | -| main.rs:735:9:735:24 | GenericStruct::<...> | main.rs:717:5:720:5 | struct GenericStruct | -| main.rs:735:23:735:23 | T | main.rs:734:10:734:10 | T | -| main.rs:737:9:737:9 | T | main.rs:734:10:734:10 | T | -| main.rs:737:12:737:17 | TraitB | main.rs:713:5:715:5 | trait TraitB | -| main.rs:738:9:738:9 | T | main.rs:734:10:734:10 | T | -| main.rs:738:12:738:17 | TraitA | main.rs:709:5:711:5 | trait TraitA | -| main.rs:749:10:749:15 | TraitA | main.rs:709:5:711:5 | trait TraitA | -| main.rs:749:21:749:31 | Implementor | main.rs:746:5:746:23 | struct Implementor | -| main.rs:751:13:751:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:756:10:756:15 | TraitB | main.rs:713:5:715:5 | trait TraitB | -| main.rs:756:21:756:31 | Implementor | main.rs:746:5:746:23 | struct Implementor | -| main.rs:758:13:758:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:764:24:764:34 | Implementor | main.rs:746:5:746:23 | struct Implementor | -| main.rs:765:23:765:35 | GenericStruct | main.rs:717:5:720:5 | struct GenericStruct | -| main.rs:771:9:771:36 | GenericStruct::<...> | main.rs:717:5:720:5 | struct GenericStruct | -| main.rs:771:9:771:50 | ...::call_trait_a | main.rs:728:9:730:9 | fn call_trait_a | -| main.rs:771:25:771:35 | Implementor | main.rs:746:5:746:23 | struct Implementor | -| main.rs:774:9:774:36 | GenericStruct::<...> | main.rs:717:5:720:5 | struct GenericStruct | -| main.rs:774:9:774:47 | ...::call_both | main.rs:740:9:743:9 | fn call_both | -| main.rs:774:25:774:35 | Implementor | main.rs:746:5:746:23 | struct Implementor | -| main.rs:780:3:780:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:780:3:780:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:784:6:784:12 | AStruct | main.rs:783:1:783:17 | struct AStruct | -| main.rs:786:7:786:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:786:7:786:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:789:7:789:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:789:7:789:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:794:9:794:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:794:9:794:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | -| main.rs:794:9:794:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:795:9:795:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:795:9:795:19 | ...::result | {EXTERNAL LOCATION} | mod result | -| main.rs:795:9:795:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | -| main.rs:803:19:803:22 | Self | main.rs:797:5:805:5 | trait Reduce | -| main.rs:803:19:803:29 | ...::Input | main.rs:798:9:798:19 | type Input | -| main.rs:804:14:804:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:804:21:804:24 | Self | main.rs:797:5:805:5 | trait Reduce | -| main.rs:804:21:804:32 | ...::Output | main.rs:799:21:800:20 | type Output | -| main.rs:804:35:804:38 | Self | main.rs:797:5:805:5 | trait Reduce | -| main.rs:804:35:804:45 | ...::Error | main.rs:798:21:799:19 | type Error | -| main.rs:808:17:808:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:808:29:808:33 | Input | main.rs:807:19:807:23 | Input | -| main.rs:809:17:809:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:809:29:809:33 | Error | main.rs:807:26:807:30 | Error | -| main.rs:816:11:816:16 | Reduce | main.rs:797:5:805:5 | trait Reduce | -| main.rs:817:13:820:9 | MyImpl::<...> | main.rs:807:5:810:5 | struct MyImpl | -| main.rs:818:13:818:17 | Input | main.rs:814:13:814:17 | Input | -| main.rs:819:13:819:17 | Error | main.rs:815:13:815:17 | Error | -| main.rs:822:22:825:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:823:13:823:17 | Input | main.rs:814:13:814:17 | Input | -| main.rs:824:13:824:16 | Self | main.rs:807:5:810:5 | struct MyImpl | -| main.rs:824:13:824:23 | ...::Error | main.rs:826:11:830:9 | type Error | -| main.rs:827:22:829:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:828:11:828:15 | Error | main.rs:815:13:815:17 | Error | -| main.rs:832:13:832:17 | Input | main.rs:814:13:814:17 | Input | -| main.rs:837:19:837:22 | Self | main.rs:807:5:810:5 | struct MyImpl | -| main.rs:837:19:837:29 | ...::Input | main.rs:822:9:826:9 | type Input | -| main.rs:838:14:841:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:839:13:839:16 | Self | main.rs:807:5:810:5 | struct MyImpl | -| main.rs:839:13:839:24 | ...::Output | main.rs:830:11:833:9 | type Output | -| main.rs:840:13:840:16 | Self | main.rs:807:5:810:5 | struct MyImpl | -| main.rs:840:13:840:23 | ...::Error | main.rs:826:11:830:9 | type Error | -| main.rs:847:5:847:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:847:11:847:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:849:15:849:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:849:15:849:25 | ...::string | {EXTERNAL LOCATION} | mod string | -| main.rs:849:15:849:33 | ...::String | {EXTERNAL LOCATION} | struct String | -| main.rs:859:7:859:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:859:7:859:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | -| main.rs:860:10:860:15 | ATrait | main.rs:855:5:857:5 | trait ATrait | -| main.rs:860:21:860:23 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:862:11:862:13 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:868:17:868:19 | Foo | main.rs:853:5:853:15 | struct Foo | -| main.rs:874:22:874:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:874:29:874:31 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:875:17:875:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:876:17:876:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:876:24:876:26 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:877:13:877:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:878:17:878:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:880:13:880:16 | None | {EXTERNAL LOCATION} | None | -| main.rs:881:17:881:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:890:19:890:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:890:26:890:28 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:891:26:891:29 | test | main.rs:873:5:887:5 | fn test | -| main.rs:897:14:897:16 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:902:17:902:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:904:13:904:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:909:13:909:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:909:18:909:18 | z | main.rs:896:5:898:12 | Const | -| main.rs:909:24:909:24 | z | main.rs:896:5:898:12 | Const | -| main.rs:916:5:916:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:916:5:916:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:916:5:916:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:916:5:916:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:916:5:916:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:917:5:917:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:917:5:917:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:918:5:918:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:918:5:918:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:918:5:918:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:918:5:918:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:919:5:919:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:920:5:920:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:921:5:921:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:921:5:921:12 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:922:5:922:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:922:5:922:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:922:5:922:13 | ...::g | main.rs:30:9:34:9 | fn g | -| main.rs:923:5:923:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:923:5:923:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:923:5:923:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | -| main.rs:923:5:923:17 | ...::h | main.rs:37:27:41:13 | fn h | -| main.rs:924:5:924:6 | m4 | main.rs:46:1:53:1 | mod m4 | -| main.rs:924:5:924:9 | ...::i | main.rs:49:5:52:5 | fn i | -| main.rs:925:5:925:5 | h | main.rs:57:1:76:1 | fn h | -| main.rs:926:5:926:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:927:5:927:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:928:5:928:5 | j | main.rs:104:1:108:1 | fn j | -| main.rs:929:5:929:6 | m6 | main.rs:116:1:128:1 | mod m6 | -| main.rs:929:5:929:9 | ...::g | main.rs:121:5:127:5 | fn g | -| main.rs:930:5:930:6 | m7 | main.rs:130:1:149:1 | mod m7 | -| main.rs:930:5:930:9 | ...::f | main.rs:141:5:148:5 | fn f | -| main.rs:931:5:931:6 | m8 | main.rs:151:1:205:1 | mod m8 | -| main.rs:931:5:931:9 | ...::g | main.rs:189:5:204:5 | fn g | -| main.rs:932:5:932:6 | m9 | main.rs:207:1:215:1 | mod m9 | -| main.rs:932:5:932:9 | ...::f | main.rs:210:5:214:5 | fn f | -| main.rs:933:5:933:7 | m11 | main.rs:238:1:275:1 | mod m11 | -| main.rs:933:5:933:10 | ...::f | main.rs:243:5:246:5 | fn f | -| main.rs:934:5:934:7 | m15 | main.rs:306:1:375:1 | mod m15 | -| main.rs:934:5:934:10 | ...::f | main.rs:362:5:374:5 | fn f | -| main.rs:935:5:935:7 | m16 | main.rs:377:1:548:1 | mod m16 | -| main.rs:935:5:935:10 | ...::f | main.rs:446:5:470:5 | fn f | -| main.rs:936:5:936:20 | trait_visibility | main.rs:550:1:600:1 | mod trait_visibility | -| main.rs:936:5:936:23 | ...::f | main.rs:577:5:599:5 | fn f | -| main.rs:937:5:937:7 | m17 | main.rs:602:1:632:1 | mod m17 | -| main.rs:937:5:937:10 | ...::f | main.rs:626:5:631:5 | fn f | -| main.rs:938:5:938:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:938:5:938:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:939:5:939:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:939:5:939:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:940:5:940:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | -| main.rs:940:5:940:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:941:5:941:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:942:5:942:12 | my_alias | main.rs:1:1:1:7 | mod my | -| main.rs:942:5:942:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:943:5:943:7 | m18 | main.rs:634:1:652:1 | mod m18 | -| main.rs:943:5:943:12 | ...::m19 | main.rs:639:5:651:5 | mod m19 | -| main.rs:943:5:943:17 | ...::m20 | main.rs:644:9:650:9 | mod m20 | -| main.rs:943:5:943:20 | ...::g | main.rs:645:13:649:13 | fn g | -| main.rs:944:5:944:7 | m23 | main.rs:681:1:706:1 | mod m23 | -| main.rs:944:5:944:10 | ...::f | main.rs:701:5:705:5 | fn f | -| main.rs:945:5:945:7 | m24 | main.rs:708:1:776:1 | mod m24 | -| main.rs:945:5:945:10 | ...::f | main.rs:762:5:775:5 | fn f | -| main.rs:946:5:946:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:946:5:946:11 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:947:5:947:13 | z_changed | main.rs:781:1:781:9 | fn z_changed | -| main.rs:948:5:948:11 | AStruct | main.rs:783:1:783:17 | struct AStruct | -| main.rs:948:5:948:22 | ...::z_on_type | main.rs:787:5:787:17 | fn z_on_type | -| main.rs:949:5:949:11 | AStruct | main.rs:783:1:783:17 | struct AStruct | -| main.rs:950:5:950:29 | impl_with_attribute_macro | main.rs:851:1:870:1 | mod impl_with_attribute_macro | -| main.rs:950:5:950:35 | ...::test | main.rs:866:5:869:5 | fn test | -| main.rs:951:5:951:12 | patterns | main.rs:872:1:913:1 | mod patterns | -| main.rs:951:5:951:18 | ...::test | main.rs:873:5:887:5 | fn test | +| main.rs:550:10:550:16 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:550:13:550:15 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:551:20:551:22 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:557:10:557:17 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:557:13:557:16 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:558:20:558:23 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:565:9:565:17 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:565:9:566:13 | ...::Assoc | main.rs:532:9:535:9 | fn Assoc | +| main.rs:565:9:566:13 | ...::Assoc | main.rs:543:9:546:9 | fn Assoc | +| main.rs:565:14:565:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:568:9:568:18 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:568:9:569:10 | ...::f1 | main.rs:550:20:553:9 | fn f1 | +| main.rs:568:9:569:10 | ...::f1 | main.rs:557:21:560:9 | fn f1 | +| main.rs:568:14:568:17 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:571:9:571:17 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:571:9:572:10 | ...::f1 | main.rs:550:20:553:9 | fn f1 | +| main.rs:571:9:572:10 | ...::f1 | main.rs:557:21:560:9 | fn f1 | +| main.rs:571:14:571:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:588:14:588:16 | Foo | main.rs:578:9:580:9 | trait Foo | +| main.rs:588:22:588:22 | X | main.rs:586:9:586:21 | struct X | +| main.rs:590:17:590:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:594:14:594:16 | Bar | main.rs:582:9:584:9 | trait Bar | +| main.rs:594:22:594:22 | X | main.rs:586:9:586:21 | struct X | +| main.rs:596:17:596:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:601:9:601:9 | m | main.rs:577:5:599:5 | mod m | +| main.rs:601:9:601:12 | ...::X | main.rs:586:9:586:21 | struct X | +| main.rs:604:17:604:17 | X | main.rs:586:9:586:21 | struct X | +| main.rs:607:17:607:17 | m | main.rs:577:5:599:5 | mod m | +| main.rs:607:17:607:22 | ...::Foo | main.rs:578:9:580:9 | trait Foo | +| main.rs:608:13:608:13 | X | main.rs:586:9:586:21 | struct X | +| main.rs:608:13:608:23 | ...::a_method | main.rs:588:26:591:13 | fn a_method | +| main.rs:612:17:612:17 | m | main.rs:577:5:599:5 | mod m | +| main.rs:612:17:612:22 | ...::Bar | main.rs:582:9:584:9 | trait Bar | +| main.rs:613:13:613:13 | X | main.rs:586:9:586:21 | struct X | +| main.rs:613:13:613:23 | ...::a_method | main.rs:594:26:597:13 | fn a_method | +| main.rs:617:17:617:17 | m | main.rs:577:5:599:5 | mod m | +| main.rs:617:17:617:22 | ...::Bar | main.rs:582:9:584:9 | trait Bar | +| main.rs:618:13:618:13 | X | main.rs:586:9:586:21 | struct X | +| main.rs:618:13:618:23 | ...::a_method | main.rs:594:26:597:13 | fn a_method | +| main.rs:623:13:623:13 | m | main.rs:577:5:599:5 | mod m | +| main.rs:623:13:623:18 | ...::Bar | main.rs:582:9:584:9 | trait Bar | +| main.rs:623:13:623:28 | ...::a_method | main.rs:583:13:583:31 | fn a_method | +| main.rs:636:10:636:16 | MyTrait | main.rs:629:5:631:5 | trait MyTrait | +| main.rs:637:9:637:9 | S | main.rs:633:5:633:13 | struct S | +| main.rs:639:13:639:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:645:7:645:13 | MyTrait | main.rs:629:5:631:5 | trait MyTrait | +| main.rs:646:10:646:10 | T | main.rs:644:10:644:10 | T | +| main.rs:648:9:648:9 | T | main.rs:644:10:644:10 | T | +| main.rs:648:9:648:12 | ...::f | main.rs:630:9:630:20 | fn f | +| main.rs:649:9:649:15 | MyTrait | main.rs:629:5:631:5 | trait MyTrait | +| main.rs:649:9:649:18 | ...::f | main.rs:630:9:630:20 | fn f | +| main.rs:654:9:654:9 | g | main.rs:643:5:650:5 | fn g | +| main.rs:655:11:655:11 | S | main.rs:633:5:633:13 | struct S | +| main.rs:662:9:662:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:667:13:667:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:672:17:672:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:673:17:673:21 | super | main.rs:665:5:677:5 | mod m19 | +| main.rs:673:17:673:24 | ...::f | main.rs:666:9:668:9 | fn f | +| main.rs:674:17:674:21 | super | main.rs:665:5:677:5 | mod m19 | +| main.rs:674:17:674:28 | ...::super | main.rs:660:1:678:1 | mod m18 | +| main.rs:674:17:674:31 | ...::f | main.rs:661:5:663:5 | fn f | +| main.rs:691:13:691:17 | super | main.rs:680:1:705:1 | mod m21 | +| main.rs:691:13:691:22 | ...::m22 | main.rs:681:5:687:5 | mod m22 | +| main.rs:691:13:691:30 | ...::MyEnum | main.rs:682:9:684:9 | enum MyEnum | +| main.rs:692:13:692:16 | self | main.rs:682:9:684:9 | enum MyEnum | +| main.rs:696:13:696:17 | super | main.rs:680:1:705:1 | mod m21 | +| main.rs:696:13:696:22 | ...::m22 | main.rs:681:5:687:5 | mod m22 | +| main.rs:696:13:696:32 | ...::MyStruct | main.rs:686:9:686:28 | struct MyStruct | +| main.rs:697:13:697:16 | self | main.rs:686:9:686:28 | struct MyStruct | +| main.rs:701:21:701:26 | MyEnum | main.rs:682:9:684:9 | enum MyEnum | +| main.rs:701:21:701:29 | ...::A | main.rs:683:13:683:13 | A | +| main.rs:702:21:702:28 | MyStruct | main.rs:686:9:686:28 | struct MyStruct | +| main.rs:718:10:720:5 | Trait1::<...> | main.rs:708:5:713:5 | trait Trait1 | +| main.rs:719:7:719:10 | Self | main.rs:715:5:715:13 | struct S | +| main.rs:721:11:721:11 | S | main.rs:715:5:715:13 | struct S | +| main.rs:723:13:723:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:729:17:729:17 | S | main.rs:715:5:715:13 | struct S | +| main.rs:745:15:745:15 | T | main.rs:744:26:744:26 | T | +| main.rs:750:9:750:24 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:750:23:750:23 | T | main.rs:749:10:749:10 | T | +| main.rs:752:9:752:9 | T | main.rs:749:10:749:10 | T | +| main.rs:752:12:752:17 | TraitA | main.rs:735:5:737:5 | trait TraitA | +| main.rs:761:9:761:24 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:761:23:761:23 | T | main.rs:760:10:760:10 | T | +| main.rs:763:9:763:9 | T | main.rs:760:10:760:10 | T | +| main.rs:763:12:763:17 | TraitB | main.rs:739:5:741:5 | trait TraitB | +| main.rs:764:9:764:9 | T | main.rs:760:10:760:10 | T | +| main.rs:764:12:764:17 | TraitA | main.rs:735:5:737:5 | trait TraitA | +| main.rs:775:10:775:15 | TraitA | main.rs:735:5:737:5 | trait TraitA | +| main.rs:775:21:775:31 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:777:13:777:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:782:10:782:15 | TraitB | main.rs:739:5:741:5 | trait TraitB | +| main.rs:782:21:782:31 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:784:13:784:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:790:24:790:34 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:791:23:791:35 | GenericStruct | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:797:9:797:36 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:797:9:797:50 | ...::call_trait_a | main.rs:754:9:756:9 | fn call_trait_a | +| main.rs:797:25:797:35 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:800:9:800:36 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:800:9:800:47 | ...::call_both | main.rs:766:9:769:9 | fn call_both | +| main.rs:800:25:800:35 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:806:3:806:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:806:3:806:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:810:6:810:12 | AStruct | main.rs:809:1:809:17 | struct AStruct | +| main.rs:812:7:812:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:812:7:812:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:815:7:815:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:815:7:815:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:820:9:820:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:820:9:820:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | +| main.rs:820:9:820:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:821:9:821:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:821:9:821:19 | ...::result | {EXTERNAL LOCATION} | mod result | +| main.rs:821:9:821:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | +| main.rs:829:19:829:22 | Self | main.rs:823:5:831:5 | trait Reduce | +| main.rs:829:19:829:29 | ...::Input | main.rs:824:9:824:19 | type Input | +| main.rs:830:14:830:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:830:21:830:24 | Self | main.rs:823:5:831:5 | trait Reduce | +| main.rs:830:21:830:32 | ...::Output | main.rs:825:21:826:20 | type Output | +| main.rs:830:35:830:38 | Self | main.rs:823:5:831:5 | trait Reduce | +| main.rs:830:35:830:45 | ...::Error | main.rs:824:21:825:19 | type Error | +| main.rs:834:17:834:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:834:29:834:33 | Input | main.rs:833:19:833:23 | Input | +| main.rs:835:17:835:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:835:29:835:33 | Error | main.rs:833:26:833:30 | Error | +| main.rs:842:11:842:16 | Reduce | main.rs:823:5:831:5 | trait Reduce | +| main.rs:843:13:846:9 | MyImpl::<...> | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:844:13:844:17 | Input | main.rs:840:13:840:17 | Input | +| main.rs:845:13:845:17 | Error | main.rs:841:13:841:17 | Error | +| main.rs:848:22:851:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:849:13:849:17 | Input | main.rs:840:13:840:17 | Input | +| main.rs:850:13:850:16 | Self | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:850:13:850:23 | ...::Error | main.rs:852:11:856:9 | type Error | +| main.rs:853:22:855:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:854:11:854:15 | Error | main.rs:841:13:841:17 | Error | +| main.rs:858:13:858:17 | Input | main.rs:840:13:840:17 | Input | +| main.rs:863:19:863:22 | Self | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:863:19:863:29 | ...::Input | main.rs:848:9:852:9 | type Input | +| main.rs:864:14:867:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:865:13:865:16 | Self | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:865:13:865:24 | ...::Output | main.rs:856:11:859:9 | type Output | +| main.rs:866:13:866:16 | Self | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:866:13:866:23 | ...::Error | main.rs:852:11:856:9 | type Error | +| main.rs:873:5:873:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:873:11:873:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:875:15:875:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:875:15:875:25 | ...::string | {EXTERNAL LOCATION} | mod string | +| main.rs:875:15:875:33 | ...::String | {EXTERNAL LOCATION} | struct String | +| main.rs:885:7:885:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:885:7:885:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | +| main.rs:886:10:886:15 | ATrait | main.rs:881:5:883:5 | trait ATrait | +| main.rs:886:21:886:23 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:888:11:888:13 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:894:17:894:19 | Foo | main.rs:879:5:879:15 | struct Foo | +| main.rs:900:22:900:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:900:29:900:31 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:901:17:901:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:902:17:902:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:902:24:902:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:903:13:903:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:904:17:904:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:906:13:906:16 | None | {EXTERNAL LOCATION} | None | +| main.rs:907:17:907:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:916:19:916:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:916:26:916:28 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:917:26:917:29 | test | main.rs:899:5:913:5 | fn test | +| main.rs:923:14:923:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:928:17:928:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:930:13:930:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:935:13:935:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:935:18:935:18 | z | main.rs:922:5:924:12 | Const | +| main.rs:935:24:935:24 | z | main.rs:922:5:924:12 | Const | +| main.rs:942:5:942:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:942:5:942:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:942:5:942:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:942:5:942:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:942:5:942:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:943:5:943:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:943:5:943:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:944:5:944:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:944:5:944:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:944:5:944:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:944:5:944:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:945:5:945:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:946:5:946:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:947:5:947:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:947:5:947:12 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:948:5:948:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:948:5:948:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:948:5:948:13 | ...::g | main.rs:30:9:34:9 | fn g | +| main.rs:949:5:949:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:949:5:949:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:949:5:949:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | +| main.rs:949:5:949:17 | ...::h | main.rs:37:27:41:13 | fn h | +| main.rs:950:5:950:6 | m4 | main.rs:46:1:53:1 | mod m4 | +| main.rs:950:5:950:9 | ...::i | main.rs:49:5:52:5 | fn i | +| main.rs:951:5:951:5 | h | main.rs:57:1:76:1 | fn h | +| main.rs:952:5:952:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:953:5:953:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:954:5:954:5 | j | main.rs:104:1:108:1 | fn j | +| main.rs:955:5:955:6 | m6 | main.rs:116:1:128:1 | mod m6 | +| main.rs:955:5:955:9 | ...::g | main.rs:121:5:127:5 | fn g | +| main.rs:956:5:956:6 | m7 | main.rs:130:1:149:1 | mod m7 | +| main.rs:956:5:956:9 | ...::f | main.rs:141:5:148:5 | fn f | +| main.rs:957:5:957:6 | m8 | main.rs:151:1:205:1 | mod m8 | +| main.rs:957:5:957:9 | ...::g | main.rs:189:5:204:5 | fn g | +| main.rs:958:5:958:6 | m9 | main.rs:207:1:215:1 | mod m9 | +| main.rs:958:5:958:9 | ...::f | main.rs:210:5:214:5 | fn f | +| main.rs:959:5:959:7 | m11 | main.rs:238:1:275:1 | mod m11 | +| main.rs:959:5:959:10 | ...::f | main.rs:243:5:246:5 | fn f | +| main.rs:960:5:960:7 | m15 | main.rs:306:1:375:1 | mod m15 | +| main.rs:960:5:960:10 | ...::f | main.rs:362:5:374:5 | fn f | +| main.rs:961:5:961:7 | m16 | main.rs:377:1:574:1 | mod m16 | +| main.rs:961:5:961:10 | ...::f | main.rs:446:5:470:5 | fn f | +| main.rs:962:5:962:20 | trait_visibility | main.rs:576:1:626:1 | mod trait_visibility | +| main.rs:962:5:962:23 | ...::f | main.rs:603:5:625:5 | fn f | +| main.rs:963:5:963:7 | m17 | main.rs:628:1:658:1 | mod m17 | +| main.rs:963:5:963:10 | ...::f | main.rs:652:5:657:5 | fn f | +| main.rs:964:5:964:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:964:5:964:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:965:5:965:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:965:5:965:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:966:5:966:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | +| main.rs:966:5:966:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:967:5:967:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:968:5:968:12 | my_alias | main.rs:1:1:1:7 | mod my | +| main.rs:968:5:968:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:969:5:969:7 | m18 | main.rs:660:1:678:1 | mod m18 | +| main.rs:969:5:969:12 | ...::m19 | main.rs:665:5:677:5 | mod m19 | +| main.rs:969:5:969:17 | ...::m20 | main.rs:670:9:676:9 | mod m20 | +| main.rs:969:5:969:20 | ...::g | main.rs:671:13:675:13 | fn g | +| main.rs:970:5:970:7 | m23 | main.rs:707:1:732:1 | mod m23 | +| main.rs:970:5:970:10 | ...::f | main.rs:727:5:731:5 | fn f | +| main.rs:971:5:971:7 | m24 | main.rs:734:1:802:1 | mod m24 | +| main.rs:971:5:971:10 | ...::f | main.rs:788:5:801:5 | fn f | +| main.rs:972:5:972:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:972:5:972:11 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:973:5:973:13 | z_changed | main.rs:807:1:807:9 | fn z_changed | +| main.rs:974:5:974:11 | AStruct | main.rs:809:1:809:17 | struct AStruct | +| main.rs:974:5:974:22 | ...::z_on_type | main.rs:813:5:813:17 | fn z_on_type | +| main.rs:975:5:975:11 | AStruct | main.rs:809:1:809:17 | struct AStruct | +| main.rs:976:5:976:29 | impl_with_attribute_macro | main.rs:877:1:896:1 | mod impl_with_attribute_macro | +| main.rs:976:5:976:35 | ...::test | main.rs:892:5:895:5 | fn test | +| main.rs:977:5:977:12 | patterns | main.rs:898:1:939:1 | mod patterns | +| main.rs:977:5:977:18 | ...::test | main.rs:899:5:913:5 | fn test | | my2/mod.rs:4:5:4:11 | println | {EXTERNAL LOCATION} | MacroRules | | 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 | @@ -557,7 +575,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:57:1:76:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:952:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:978:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:57:1:76:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |