Skip to content

Commit d0e30d1

Browse files
committed
Rust: Resolve as paths to trait
1 parent 8de37fe commit d0e30d1

File tree

5 files changed

+35
-16
lines changed

5 files changed

+35
-16
lines changed

rust/ql/lib/codeql/rust/internal/PathResolution.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1556,7 +1556,8 @@ private class PathExtPath extends PathExt instanceof Path {
15561556
tree.hasPath() and
15571557
this = getAUseTreeUseTree(tree).getPath().getQualifier*()
15581558
) and
1559-
name = Path.super.getText()
1559+
// For a `<Type as Trait>` path we resolve the trait name
1560+
name = [Path.super.getText(), Path.super.getSegment().getTraitTypeRepr().getPath().getText()]
15601561
}
15611562

15621563
override Path getQualifier() { result = Path.super.getQualifier() }

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ mod m8 {
194194
<MyStruct as // $ item=I50
195195
MyTrait // $ item=I47
196196
> // $ MISSING: item=52
197-
::f(&x); // $ MISSING: item=I53
197+
::f(&x); // $ item=I48
198198
let x = MyStruct {}; // $ item=I50
199199
x.f(); // $ item=I53
200200
let x = MyStruct {}; // $ item=I50
@@ -365,10 +365,10 @@ mod m15 {
365365
let x = S; // $ item=I81
366366
<S // $ item=I81
367367
as Trait1 // $ item=I79
368-
>::f(&x); // $ MISSING: item=I76
368+
>::f(&x); // $ item=Trait1::f
369369
<S // $ item=I81
370370
as Trait2 // $ item=I82
371-
>::f(&x); // $ MISSING: item=I78
371+
>::f(&x); // $ item=Trait2::f
372372
S::g(&x); // $ item=I77
373373
x.g(); // $ item=I77
374374
} // I75
@@ -452,12 +452,12 @@ mod m16 {
452452
as Trait1<
453453
S // $ item=I90
454454
> // $ item=I86
455-
>::f(&x); // $ MISSING: item=I91
455+
>::f(&x); // $ item=Trait1::f
456456
<S // $ item=I90
457457
as Trait2<
458458
S // $ item=I90
459459
> // $ item=I89
460-
>::f(&x); // $ MISSING: item=I93
460+
>::f(&x); // $ item=Trait2::f
461461
S::g(&x); // $ item=I92
462462
x.g(); // $ item=I92
463463
S::h(&x); // $ item=I96
@@ -467,7 +467,7 @@ mod m16 {
467467
as Trait1<
468468
S // $ item=I90
469469
> // $ item=I86
470-
>::c; // $ MISSING: item=I95
470+
>::c; // $ item=I94
471471
} // I83
472472

473473
trait Trait3 {
@@ -945,10 +945,10 @@ mod associated_types_subtrait {
945945
#[rustfmt::skip]
946946
impl S<bool> { // $ item=S item=bool
947947
fn _test() {
948-
let _c: <S<i32> as Super>::Out = 'a'; // $ item=S item=i32 item=Super MISSING: item=SuperAssoc
949-
let _i: <S<bool> as Super>::Out = 1; // $ item=S item=bool item=Super MISSING: item=SuperAssoc
948+
let _c: <S<i32> as Super>::Out = 'a'; // $ item=S item=i32 item=Super item=SuperAssoc
949+
let _i: <S<bool> as Super>::Out = 1; // $ item=S item=bool item=Super item=SuperAssoc
950950

951-
let _b: <S<bool> as SuperAlt>::Out = true; // $ item=S item=bool item=SuperAlt MISSING: item=SuperAltAssoc
951+
let _b: <S<bool> as SuperAlt>::Out = true; // $ item=S item=bool item=SuperAlt item=SuperAltAssoc
952952
}
953953
}
954954
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ resolvePath
146146
| main.rs:192:9:192:18 | ...::f | main.rs:153:9:153:20 | fn f |
147147
| main.rs:193:9:193:16 | MyStruct | main.rs:162:5:162:22 | struct MyStruct |
148148
| main.rs:193:9:193:19 | ...::f | main.rs:169:33:174:9 | fn f |
149+
| main.rs:194:9:196:9 | <...> | main.rs:152:5:160:5 | trait MyTrait |
150+
| main.rs:194:9:197:11 | ...::f | main.rs:153:9:153:20 | fn f |
149151
| main.rs:194:10:194:17 | MyStruct | main.rs:162:5:162:22 | struct MyStruct |
150152
| main.rs:195:10:195:16 | MyTrait | main.rs:152:5:160:5 | trait MyTrait |
151153
| main.rs:198:17:198:24 | MyStruct | main.rs:162:5:162:22 | struct MyStruct |
@@ -207,8 +209,12 @@ resolvePath
207209
| main.rs:358:13:358:19 | println | {EXTERNAL LOCATION} | MacroRules |
208210
| main.rs:364:9:364:15 | println | {EXTERNAL LOCATION} | MacroRules |
209211
| main.rs:365:17:365:17 | S | main.rs:338:5:338:13 | struct S |
212+
| main.rs:366:9:368:9 | <...> | main.rs:307:5:311:5 | trait Trait1 |
213+
| main.rs:366:9:368:12 | ...::f | main.rs:308:9:308:20 | fn f |
210214
| main.rs:366:10:366:10 | S | main.rs:338:5:338:13 | struct S |
211215
| main.rs:367:14:367:19 | Trait1 | main.rs:307:5:311:5 | trait Trait1 |
216+
| main.rs:369:9:371:9 | <...> | main.rs:313:5:321:5 | trait Trait2 |
217+
| main.rs:369:9:371:12 | ...::f | main.rs:315:18:320:9 | fn f |
212218
| main.rs:369:10:369:10 | S | main.rs:338:5:338:13 | struct S |
213219
| main.rs:370:14:370:19 | Trait2 | main.rs:313:5:321:5 | trait Trait2 |
214220
| main.rs:372:9:372:9 | S | main.rs:338:5:338:13 | struct S |
@@ -251,9 +257,13 @@ resolvePath
251257
| main.rs:443:13:443:19 | ...::c | main.rs:431:9:432:9 | Const |
252258
| main.rs:449:9:449:15 | println | {EXTERNAL LOCATION} | MacroRules |
253259
| main.rs:450:17:450:17 | S | main.rs:413:5:413:13 | struct S |
260+
| main.rs:451:9:455:9 | <...> | main.rs:378:5:396:5 | trait Trait1 |
261+
| main.rs:451:9:455:12 | ...::f | main.rs:382:9:383:9 | fn f |
254262
| main.rs:451:10:451:10 | S | main.rs:413:5:413:13 | struct S |
255263
| main.rs:452:14:454:11 | Trait1::<...> | main.rs:378:5:396:5 | trait Trait1 |
256264
| main.rs:453:13:453:13 | S | main.rs:413:5:413:13 | struct S |
265+
| main.rs:456:9:460:9 | <...> | main.rs:398:5:411:5 | trait Trait2 |
266+
| main.rs:456:9:460:12 | ...::f | main.rs:404:13:410:9 | fn f |
257267
| main.rs:456:10:456:10 | S | main.rs:413:5:413:13 | struct S |
258268
| main.rs:457:14:459:11 | Trait2::<...> | main.rs:398:5:411:5 | trait Trait2 |
259269
| main.rs:458:13:458:13 | S | main.rs:413:5:413:13 | struct S |
@@ -263,6 +273,8 @@ resolvePath
263273
| main.rs:463:9:463:12 | ...::h | main.rs:389:9:392:9 | fn h |
264274
| main.rs:465:9:465:9 | S | main.rs:413:5:413:13 | struct S |
265275
| main.rs:465:9:465:12 | ...::c | main.rs:431:9:432:9 | Const |
276+
| main.rs:466:9:470:9 | <...> | main.rs:378:5:396:5 | trait Trait1 |
277+
| main.rs:466:9:470:12 | ...::c | main.rs:394:9:395:9 | Const |
266278
| main.rs:466:10:466:10 | S | main.rs:413:5:413:13 | struct S |
267279
| main.rs:467:14:469:11 | Trait1::<...> | main.rs:378:5:396:5 | trait Trait1 |
268280
| main.rs:468:13:468:13 | S | main.rs:413:5:413:13 | struct S |
@@ -489,12 +501,18 @@ resolvePath
489501
| main.rs:940:23:940:31 | ...::Out | main.rs:923:9:923:17 | type Out |
490502
| main.rs:946:10:946:16 | S::<...> | main.rs:892:5:894:6 | struct S |
491503
| main.rs:946:12:946:15 | bool | {EXTERNAL LOCATION} | struct bool |
504+
| main.rs:948:21:948:37 | <...> | main.rs:882:5:884:5 | trait Super |
505+
| main.rs:948:21:948:42 | ...::Out | main.rs:883:9:883:17 | type Out |
492506
| main.rs:948:22:948:27 | S::<...> | main.rs:892:5:894:6 | struct S |
493507
| main.rs:948:24:948:26 | i32 | {EXTERNAL LOCATION} | struct i32 |
494508
| main.rs:948:32:948:36 | Super | main.rs:882:5:884:5 | trait Super |
509+
| main.rs:949:21:949:38 | <...> | main.rs:882:5:884:5 | trait Super |
510+
| main.rs:949:21:949:43 | ...::Out | main.rs:883:9:883:17 | type Out |
495511
| main.rs:949:22:949:28 | S::<...> | main.rs:892:5:894:6 | struct S |
496512
| main.rs:949:24:949:27 | bool | {EXTERNAL LOCATION} | struct bool |
497513
| main.rs:949:33:949:37 | Super | main.rs:882:5:884:5 | trait Super |
514+
| main.rs:951:21:951:41 | <...> | main.rs:922:5:924:5 | trait SuperAlt |
515+
| main.rs:951:21:951:46 | ...::Out | main.rs:923:9:923:17 | type Out |
498516
| main.rs:951:22:951:28 | S::<...> | main.rs:892:5:894:6 | struct S |
499517
| main.rs:951:24:951:27 | bool | {EXTERNAL LOCATION} | struct bool |
500518
| main.rs:951:33:951:40 | SuperAlt | main.rs:922:5:924:5 | trait SuperAlt |

rust/ql/test/library-tests/type-inference/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,10 @@ mod method_call_trait_path_disambig {
205205
let s = S;
206206

207207
let _b1 = FirstTrait::method(&s); // $ type=_b1:bool target=FirstTrait::method
208-
let _b2 = <S as FirstTrait>::method(&s); // $ type=_b2:bool target=FirstTrait::method SPURIOUS: target=SecondTrait::method
208+
let _b2 = <S as FirstTrait>::method(&s); // $ type=_b2:bool target=FirstTrait::method
209209

210210
let _n1 = SecondTrait::method(&s); // $ type=_n1:i64 target=SecondTrait::method
211-
let _n2 = <S as SecondTrait>::method(&s); // $ type=_n2:i64 target=SecondTrait::method SPURIOUS: target=FirstTrait::method
211+
let _n2 = <S as SecondTrait>::method(&s); // $ type=_n2:i64 target=SecondTrait::method
212212
}
213213
}
214214

rust/ql/test/library-tests/type-inference/type-inference.expected

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,10 +1151,14 @@ inferCertainType
11511151
| main.rs:207:13:207:15 | _b1 | | {EXTERNAL LOCATION} | bool |
11521152
| main.rs:207:19:207:40 | ...::method(...) | | {EXTERNAL LOCATION} | bool |
11531153
| main.rs:207:38:207:39 | &s | | {EXTERNAL LOCATION} | & |
1154+
| main.rs:208:13:208:15 | _b2 | | {EXTERNAL LOCATION} | bool |
1155+
| main.rs:208:19:208:47 | ...::method(...) | | {EXTERNAL LOCATION} | bool |
11541156
| main.rs:208:45:208:46 | &s | | {EXTERNAL LOCATION} | & |
11551157
| main.rs:210:13:210:15 | _n1 | | {EXTERNAL LOCATION} | i64 |
11561158
| main.rs:210:19:210:41 | ...::method(...) | | {EXTERNAL LOCATION} | i64 |
11571159
| main.rs:210:39:210:40 | &s | | {EXTERNAL LOCATION} | & |
1160+
| main.rs:211:13:211:15 | _n2 | | {EXTERNAL LOCATION} | i64 |
1161+
| main.rs:211:19:211:48 | ...::method(...) | | {EXTERNAL LOCATION} | i64 |
11581162
| main.rs:211:46:211:47 | &s | | {EXTERNAL LOCATION} | & |
11591163
| main.rs:228:15:228:18 | SelfParam | | main.rs:216:5:219:5 | MyThing |
11601164
| main.rs:228:15:228:18 | SelfParam | A | main.rs:221:5:222:14 | S1 |
@@ -6895,9 +6899,7 @@ inferType
68956899
| main.rs:207:38:207:39 | &s | TRef | main.rs:200:5:200:13 | S |
68966900
| main.rs:207:39:207:39 | s | | main.rs:200:5:200:13 | S |
68976901
| main.rs:208:13:208:15 | _b2 | | {EXTERNAL LOCATION} | bool |
6898-
| main.rs:208:13:208:15 | _b2 | | {EXTERNAL LOCATION} | i64 |
68996902
| main.rs:208:19:208:47 | ...::method(...) | | {EXTERNAL LOCATION} | bool |
6900-
| main.rs:208:19:208:47 | ...::method(...) | | {EXTERNAL LOCATION} | i64 |
69016903
| main.rs:208:45:208:46 | &s | | {EXTERNAL LOCATION} | & |
69026904
| main.rs:208:45:208:46 | &s | TRef | main.rs:200:5:200:13 | S |
69036905
| main.rs:208:46:208:46 | s | | main.rs:200:5:200:13 | S |
@@ -6906,9 +6908,7 @@ inferType
69066908
| main.rs:210:39:210:40 | &s | | {EXTERNAL LOCATION} | & |
69076909
| main.rs:210:39:210:40 | &s | TRef | main.rs:200:5:200:13 | S |
69086910
| main.rs:210:40:210:40 | s | | main.rs:200:5:200:13 | S |
6909-
| main.rs:211:13:211:15 | _n2 | | {EXTERNAL LOCATION} | bool |
69106911
| main.rs:211:13:211:15 | _n2 | | {EXTERNAL LOCATION} | i64 |
6911-
| main.rs:211:19:211:48 | ...::method(...) | | {EXTERNAL LOCATION} | bool |
69126912
| main.rs:211:19:211:48 | ...::method(...) | | {EXTERNAL LOCATION} | i64 |
69136913
| main.rs:211:46:211:47 | &s | | {EXTERNAL LOCATION} | & |
69146914
| main.rs:211:46:211:47 | &s | TRef | main.rs:200:5:200:13 | S |

0 commit comments

Comments
 (0)