Skip to content

Commit 13bc0d2

Browse files
authored
Merge pull request #19825 from hvitved/rust/path-resolution-consistency-remove-overlap
Rust: Avoid overlapping path resolution consistency checks
2 parents 725ba28 + 1f09f71 commit 13bc0d2

File tree

23 files changed

+285
-844
lines changed

23 files changed

+285
-844
lines changed

rust/ql/consistency-queries/PathResolutionConsistency.ql

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,17 @@ private import codeql.rust.internal.PathResolution
1010
private import codeql.rust.internal.PathResolutionConsistency as PathResolutionConsistency
1111
private import codeql.rust.elements.Locatable
1212
private import codeql.Locations
13-
import PathResolutionConsistency
1413

1514
class SourceLocatable extends Locatable {
16-
Location getLocation() {
17-
if super.getLocation().fromSource()
18-
then result = super.getLocation()
19-
else result instanceof EmptyLocation
20-
}
15+
SourceLocatable() { this.fromSource() }
2116
}
2217

23-
query predicate multipleMethodCallTargets(SourceLocatable a, SourceLocatable b) {
24-
PathResolutionConsistency::multipleMethodCallTargets(a, b)
18+
query predicate multipleCallTargets(SourceLocatable a) {
19+
PathResolutionConsistency::multipleCallTargets(a, _)
2520
}
2621

27-
query predicate multiplePathResolutions(SourceLocatable a, SourceLocatable b) {
28-
PathResolutionConsistency::multiplePathResolutions(a, b)
22+
query predicate multiplePathResolutions(SourceLocatable a) {
23+
PathResolutionConsistency::multiplePathResolutions(a, _)
2924
}
3025

3126
query predicate multipleCanonicalPaths(SourceLocatable i, SourceLocatable c, string path) {

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ query predicate multiplePathResolutions(Path p, ItemNode i) {
1717
not use.isGlob() and
1818
not use.hasUseTreeList()
1919
).getPath() and
20+
// avoid overlap with `multipleCallTargets` below
21+
not p = any(CallExpr ce).getFunction().(PathExpr).getPath() and
2022
strictcount(resolvePath(p)) > 1
2123
}
2224

2325
/** Holds if `call` has multiple static call targets including `target`. */
24-
query predicate multipleMethodCallTargets(MethodCallExpr call, Callable target) {
26+
query predicate multipleCallTargets(CallExprBase call, Callable target) {
2527
target = call.getStaticTarget() and
2628
strictcount(call.getStaticTarget()) > 1
2729
}
@@ -51,8 +53,8 @@ int getPathResolutionInconsistencyCounts(string type) {
5153
type = "Multiple path resolutions" and
5254
result = count(Path p | multiplePathResolutions(p, _) | p)
5355
or
54-
type = "Multiple static method call targets" and
55-
result = count(CallExprBase call | multipleMethodCallTargets(call, _) | call)
56+
type = "Multiple static call targets" and
57+
result = count(CallExprBase call | multipleCallTargets(call, _) | call)
5658
or
5759
type = "Multiple record fields" and
5860
result = count(FieldExpr fe | multipleStructFields(fe, _) | fe)

rust/ql/test/extractor-tests/crate_graph/CONSISTENCY/PathResolutionConsistency.expected

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
multipleCallTargets
2+
| proc_macro.rs:16:12:16:16 | ...::to_tokens(...) |
3+
| proc_macro.rs:26:10:26:12 | ...::to_tokens(...) |
4+
| proc_macro.rs:27:10:27:16 | ...::to_tokens(...) |
5+
| proc_macro.rs:42:16:42:26 | ...::to_tokens(...) |
6+
| proc_macro.rs:44:27:44:30 | ...::to_tokens(...) |
7+
| proc_macro.rs:46:18:46:28 | ...::to_tokens(...) |
18
multiplePathResolutions
2-
| macro_expansion.rs:1:5:1:14 | proc_macro | file://:0:0:0:0 | Crate([email protected]) |
3-
| macro_expansion.rs:1:5:1:14 | proc_macro | proc_macro.rs:0:0:0:0 | Crate([email protected]) |
9+
| macro_expansion.rs:1:5:1:14 | proc_macro |
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
multipleCallTargets
2+
| main.rs:225:14:225:29 | ...::deref(...) |
Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,3 @@
1-
multiplePathResolutions
2-
| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from |
3-
| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from |
4-
| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from |
5-
| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from |
6-
| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from |
7-
| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from |
8-
| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from |
9-
| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from |
10-
| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from |
11-
| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from |
12-
| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from |
13-
| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from |
14-
| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from |
15-
| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from |
1+
multipleCallTargets
2+
| main.rs:532:10:532:21 | ...::from(...) |
3+
| main.rs:538:10:538:21 | ...::from(...) |
Lines changed: 84 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,84 @@
1-
multipleMethodCallTargets
2-
| test.rs:618:25:618:49 | address.to_socket_addrs() | file://:0:0:0:0 | fn to_socket_addrs |
3-
| test.rs:618:25:618:49 | address.to_socket_addrs() | file://:0:0:0:0 | fn to_socket_addrs |
4-
| test_futures_io.rs:35:26:35:63 | pinned.poll_read(...) | file://:0:0:0:0 | fn poll_read |
5-
| test_futures_io.rs:35:26:35:63 | pinned.poll_read(...) | file://:0:0:0:0 | fn poll_read |
6-
| test_futures_io.rs:35:26:35:63 | pinned.poll_read(...) | file://:0:0:0:0 | fn poll_read |
7-
| test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) | file://:0:0:0:0 | fn poll_fill_buf |
8-
| test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) | file://:0:0:0:0 | fn poll_fill_buf |
9-
| test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) | file://:0:0:0:0 | fn poll_fill_buf |
10-
| test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) | file://:0:0:0:0 | fn poll_fill_buf |
11-
| test_futures_io.rs:93:26:93:63 | pinned.poll_read(...) | file://:0:0:0:0 | fn poll_read |
12-
| test_futures_io.rs:93:26:93:63 | pinned.poll_read(...) | file://:0:0:0:0 | fn poll_read |
13-
| test_futures_io.rs:93:26:93:63 | pinned.poll_read(...) | file://:0:0:0:0 | fn poll_read |
14-
| test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) | file://:0:0:0:0 | fn poll_fill_buf |
15-
| test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) | file://:0:0:0:0 | fn poll_fill_buf |
16-
| web_frameworks.rs:101:14:101:23 | a.as_str() | file://:0:0:0:0 | fn as_str |
17-
| web_frameworks.rs:101:14:101:23 | a.as_str() | file://:0:0:0:0 | fn as_str |
18-
| web_frameworks.rs:102:14:102:25 | a.as_bytes() | file://:0:0:0:0 | fn as_bytes |
19-
| web_frameworks.rs:102:14:102:25 | a.as_bytes() | file://:0:0:0:0 | fn as_bytes |
20-
multiplePathResolutions
21-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
22-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
23-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
24-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
25-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
26-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
27-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
28-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
29-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
30-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
31-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
32-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
33-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
34-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
35-
| test.rs:112:62:112:73 | ...::from | file://:0:0:0:0 | fn from |
36-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
37-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
38-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
39-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
40-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
41-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
42-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
43-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
44-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
45-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
46-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
47-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
48-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
49-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
50-
| test.rs:119:58:119:69 | ...::from | file://:0:0:0:0 | fn from |
51-
| test.rs:777:23:777:61 | ...::try_from | file://:0:0:0:0 | fn try_from |
52-
| test.rs:777:23:777:61 | ...::try_from | file://:0:0:0:0 | fn try_from |
53-
| test.rs:777:23:777:61 | ...::try_from | file://:0:0:0:0 | fn try_from |
54-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
55-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
56-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
57-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
58-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
59-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
60-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
61-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
62-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
63-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
64-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
65-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
66-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
67-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
68-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
69-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
70-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
71-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
72-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
73-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
74-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
75-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
76-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
77-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
78-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
79-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
80-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
81-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
82-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
83-
| test.rs:806:50:806:61 | ...::from | file://:0:0:0:0 | fn from |
84-
| test_futures_io.rs:25:23:25:61 | ...::try_from | file://:0:0:0:0 | fn try_from |
85-
| test_futures_io.rs:25:23:25:61 | ...::try_from | file://:0:0:0:0 | fn try_from |
86-
| test_futures_io.rs:25:23:25:61 | ...::try_from | file://:0:0:0:0 | fn try_from |
87-
| test_futures_io.rs:145:26:145:43 | ...::with_capacity | file://:0:0:0:0 | fn with_capacity |
88-
| test_futures_io.rs:145:26:145:43 | ...::with_capacity | file://:0:0:0:0 | fn with_capacity |
89-
| web_frameworks.rs:40:5:40:26 | ...::write_str | file://:0:0:0:0 | fn write_str |
90-
| web_frameworks.rs:40:5:40:26 | ...::write_str | file://:0:0:0:0 | fn write_str |
91-
| web_frameworks.rs:40:5:40:26 | ...::write_str | file://:0:0:0:0 | fn write_str |
92-
| web_frameworks.rs:40:5:40:26 | ...::write_str | file://:0:0:0:0 | fn write_str |
93-
multipleCanonicalPaths
94-
| file://:0:0:0:0 | fn to_ordering | file://:0:0:0:0 | Crate([email protected]) | <typenum::Equal as core::cmp::Ord>::to_ordering |
95-
| file://:0:0:0:0 | fn to_ordering | file://:0:0:0:0 | Crate([email protected]) | <typenum::Equal as typenum::marker_traits::Ord>::to_ordering |
96-
| file://:0:0:0:0 | fn to_ordering | file://:0:0:0:0 | Crate([email protected]) | <typenum::Greater as core::cmp::Ord>::to_ordering |
97-
| file://:0:0:0:0 | fn to_ordering | file://:0:0:0:0 | Crate([email protected]) | <typenum::Greater as typenum::marker_traits::Ord>::to_ordering |
98-
| file://:0:0:0:0 | fn to_ordering | file://:0:0:0:0 | Crate([email protected]) | <typenum::Less as core::cmp::Ord>::to_ordering |
99-
| file://:0:0:0:0 | fn to_ordering | file://:0:0:0:0 | Crate([email protected]) | <typenum::Less as typenum::marker_traits::Ord>::to_ordering |
100-
| file://:0:0:0:0 | impl Ord for Equal { ... } | file://:0:0:0:0 | Crate([email protected]) | <typenum::Equal as core::cmp::Ord> |
101-
| file://:0:0:0:0 | impl Ord for Equal { ... } | file://:0:0:0:0 | Crate([email protected]) | <typenum::Equal as typenum::marker_traits::Ord> |
102-
| file://:0:0:0:0 | impl Ord for Greater { ... } | file://:0:0:0:0 | Crate([email protected]) | <typenum::Greater as core::cmp::Ord> |
103-
| file://:0:0:0:0 | impl Ord for Greater { ... } | file://:0:0:0:0 | Crate([email protected]) | <typenum::Greater as typenum::marker_traits::Ord> |
104-
| file://:0:0:0:0 | impl Ord for Less { ... } | file://:0:0:0:0 | Crate([email protected]) | <typenum::Less as core::cmp::Ord> |
105-
| file://:0:0:0:0 | impl Ord for Less { ... } | file://:0:0:0:0 | Crate([email protected]) | <typenum::Less as typenum::marker_traits::Ord> |
1+
multipleCallTargets
2+
| test.rs:98:14:98:43 | ...::_print(...) |
3+
| test.rs:109:14:109:33 | ...::_print(...) |
4+
| test.rs:112:62:112:77 | ...::from(...) |
5+
| test.rs:119:58:119:73 | ...::from(...) |
6+
| test.rs:135:22:135:43 | ...::_print(...) |
7+
| test.rs:140:22:140:43 | ...::_print(...) |
8+
| test.rs:144:22:144:44 | ...::_print(...) |
9+
| test.rs:160:26:160:110 | ...::_print(...) |
10+
| test.rs:168:26:168:111 | ...::_print(...) |
11+
| test.rs:178:30:178:68 | ...::_print(...) |
12+
| test.rs:187:26:187:105 | ...::_print(...) |
13+
| test.rs:609:18:609:38 | ...::_print(...) |
14+
| test.rs:614:18:614:45 | ...::_print(...) |
15+
| test.rs:618:25:618:49 | address.to_socket_addrs() |
16+
| test.rs:632:38:632:42 | ...::_print(...) |
17+
| test.rs:636:38:636:54 | ...::_print(...) |
18+
| test.rs:641:38:641:51 | ...::_print(...) |
19+
| test.rs:651:34:651:52 | ...::_print(...) |
20+
| test.rs:670:14:670:43 | ...::_print(...) |
21+
| test.rs:685:18:685:42 | ...::_print(...) |
22+
| test.rs:689:18:689:42 | ...::_print(...) |
23+
| test.rs:694:18:694:45 | ...::_print(...) |
24+
| test.rs:701:30:701:34 | ...::_print(...) |
25+
| test.rs:705:30:705:52 | ...::_print(...) |
26+
| test.rs:714:30:714:43 | ...::_print(...) |
27+
| test.rs:724:30:724:34 | ...::_print(...) |
28+
| test.rs:728:30:728:52 | ...::_print(...) |
29+
| test.rs:737:30:737:43 | ...::_print(...) |
30+
| test.rs:752:14:752:43 | ...::_print(...) |
31+
| test.rs:766:14:766:34 | ...::_print(...) |
32+
| test.rs:777:23:777:80 | ...::try_from(...) |
33+
| test.rs:806:50:806:66 | ...::from(...) |
34+
| test.rs:806:50:806:66 | ...::from(...) |
35+
| test.rs:808:14:808:31 | ...::_print(...) |
36+
| test.rs:811:14:811:31 | ...::_print(...) |
37+
| test.rs:814:14:814:31 | ...::_print(...) |
38+
| test.rs:817:14:817:30 | ...::_print(...) |
39+
| test.rs:819:27:819:36 | ...::_print(...) |
40+
| test.rs:820:28:820:41 | ...::_print(...) |
41+
| test.rs:823:14:823:33 | ...::_print(...) |
42+
| test.rs:825:27:825:36 | ...::_print(...) |
43+
| test.rs:826:28:826:41 | ...::_print(...) |
44+
| test.rs:829:14:829:31 | ...::_print(...) |
45+
| test.rs:831:27:831:36 | ...::_print(...) |
46+
| test.rs:832:28:832:41 | ...::_print(...) |
47+
| test.rs:835:14:835:34 | ...::_print(...) |
48+
| test.rs:837:27:837:36 | ...::_print(...) |
49+
| test.rs:838:28:838:41 | ...::_print(...) |
50+
| test.rs:841:14:841:25 | ...::_print(...) |
51+
| test.rs:843:27:843:36 | ...::_print(...) |
52+
| test.rs:844:28:844:41 | ...::_print(...) |
53+
| test.rs:847:14:847:31 | ...::_print(...) |
54+
| test.rs:849:27:849:36 | ...::_print(...) |
55+
| test.rs:850:28:850:41 | ...::_print(...) |
56+
| test.rs:853:14:853:30 | ...::_print(...) |
57+
| test.rs:855:27:855:36 | ...::_print(...) |
58+
| test.rs:856:28:856:41 | ...::_print(...) |
59+
| test.rs:859:14:859:33 | ...::_print(...) |
60+
| test.rs:861:27:861:36 | ...::_print(...) |
61+
| test.rs:862:28:862:41 | ...::_print(...) |
62+
| test.rs:865:14:865:36 | ...::_print(...) |
63+
| test.rs:867:27:867:36 | ...::_print(...) |
64+
| test.rs:868:28:868:41 | ...::_print(...) |
65+
| test.rs:871:14:871:38 | ...::_print(...) |
66+
| test.rs:873:27:873:36 | ...::_print(...) |
67+
| test.rs:874:28:874:41 | ...::_print(...) |
68+
| test.rs:877:14:877:45 | ...::_print(...) |
69+
| test.rs:879:27:879:36 | ...::_print(...) |
70+
| test.rs:880:28:880:41 | ...::_print(...) |
71+
| test.rs:883:14:883:29 | ...::_print(...) |
72+
| test.rs:885:27:885:36 | ...::_print(...) |
73+
| test.rs:886:28:886:41 | ...::_print(...) |
74+
| test_futures_io.rs:25:23:25:80 | ...::try_from(...) |
75+
| test_futures_io.rs:35:26:35:63 | pinned.poll_read(...) |
76+
| test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) |
77+
| test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) |
78+
| test_futures_io.rs:93:26:93:63 | pinned.poll_read(...) |
79+
| test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) |
80+
| test_futures_io.rs:145:26:145:49 | ...::with_capacity(...) |
81+
| web_frameworks.rs:40:5:40:26 | ...::write_str(...) |
82+
| web_frameworks.rs:40:5:40:26 | ...::write_str(...) |
83+
| web_frameworks.rs:101:14:101:23 | a.as_str() |
84+
| web_frameworks.rs:102:14:102:25 | a.as_bytes() |
Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
multipleMethodCallTargets
2-
| main.rs:64:16:64:25 | s.as_str() | file://:0:0:0:0 | fn as_str |
3-
| main.rs:64:16:64:25 | s.as_str() | file://:0:0:0:0 | fn as_str |
4-
multiplePathResolutions
5-
| main.rs:52:14:52:25 | ...::from | file://:0:0:0:0 | fn from |
6-
| main.rs:52:14:52:25 | ...::from | file://:0:0:0:0 | fn from |
7-
| main.rs:52:14:52:25 | ...::from | file://:0:0:0:0 | fn from |
8-
| main.rs:52:14:52:25 | ...::from | file://:0:0:0:0 | fn from |
9-
| main.rs:52:14:52:25 | ...::from | file://:0:0:0:0 | fn from |
10-
| main.rs:52:14:52:25 | ...::from | file://:0:0:0:0 | fn from |
1+
multipleCallTargets
2+
| main.rs:52:14:52:29 | ...::from(...) |
3+
| main.rs:64:16:64:25 | s.as_str() |

0 commit comments

Comments
 (0)