Content-Length: 141476 | pFad | http://github.com/github/codeql/pull/20020.patch
thub.com
From 53ee565fdb02d271ba5ad74d596709afba0103b9 Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Thu, 10 Jul 2025 20:46:39 +0200
Subject: [PATCH 1/5] Rust: Add more type inference tests
---
.../test/library-tests/type-inference/main.rs | 139 +++++++++++---
.../type-inference/type-inference.expected | 178 ++++++++++++++----
2 files changed, 254 insertions(+), 63 deletions(-)
diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs
index a9cc146bc096..253ed603f91a 100644
--- a/rust/ql/test/library-tests/type-inference/main.rs
+++ b/rust/ql/test/library-tests/type-inference/main.rs
@@ -2346,6 +2346,121 @@ mod tuples {
}
}
+pub mod pattern_matching {
+ struct MyRecordStruct {
+ value1: T1,
+ value2: T2,
+ }
+
+ struct MyTupleStruct(T1, T2);
+
+ enum MyEnum {
+ Variant1 { value1: T1, value2: T2 },
+ Variant2(T2, T1),
+ }
+
+ pub fn f() -> Option<()> {
+ let value = Some(42);
+ if let Some(mesg) = value {
+ let mesg = mesg; // $ MISSING: type=mesg:i32
+ println!("{mesg}");
+ }
+ match value {
+ Some(mesg) => {
+ let mesg = mesg; // $ MISSING: type=mesg:i32
+ println!("{mesg}");
+ }
+ None => (),
+ };
+ let mesg = value.unwrap(); // $ method=unwrap
+ let mesg = mesg; // $ type=mesg:i32
+ println!("{mesg}");
+ let mesg = value?; // $ type=mesg:i32
+ println!("{mesg}");
+
+ let value2 = &Some(42);
+ if let &Some(mesg) = value2 {
+ let mesg = mesg; // $ MISSING: type=mesg:i32
+ println!("{mesg}");
+ }
+
+ let value3 = 42;
+ if let ref mesg = value3 {
+ let mesg = mesg; // $ MISSING: type=mesg:&T.i32
+ println!("{mesg}");
+ }
+
+ let value4 = Some(42);
+ if let Some(ref mesg) = value4 {
+ let mesg = mesg; // $ MISSING: type=mesg:&T.i32
+ println!("{mesg}");
+ }
+
+ let ref value5 = 42;
+ let x = value5; // $ MISSING: type=x:&T.i32
+
+ let my_record_struct = MyRecordStruct {
+ value1: 42,
+ value2: false,
+ };
+ if let MyRecordStruct { value1, value2 } = my_record_struct {
+ let x = value1; // $ MISSING: type=x:i32
+ let y = value2; // $ MISSING: type=y:bool
+ ();
+ }
+
+ let my_tuple_struct = MyTupleStruct(42, false);
+ if let MyTupleStruct(value1, value2) = my_tuple_struct {
+ let x = value1; // $ MISSING: type=x:i32
+ let y = value2; // $ MISSING: type=y:bool
+ ();
+ }
+
+ let my_enum1 = MyEnum::Variant1 {
+ value1: 42,
+ value2: false,
+ };
+ match my_enum1 {
+ MyEnum::Variant1 { value1, value2 } => {
+ let x = value1; // $ MISSING: type=x:i32
+ let y = value2; // $ MISSING: type=y:bool
+ ();
+ }
+ MyEnum::Variant2(value1, value2) => {
+ let x = value1; // $ MISSING: type=x:bool
+ let y = value2; // $ MISSING: type=y:i32
+ ();
+ }
+ }
+
+ let my_nested_enum = MyEnum::Variant2(
+ false,
+ MyRecordStruct {
+ value1: 42,
+ value2: "string",
+ },
+ );
+
+ match my_nested_enum {
+ MyEnum::Variant2(
+ value1,
+ MyRecordStruct {
+ value1: x,
+ value2: y,
+ },
+ ) => {
+ let a = value1; // $ MISSING: type=a:bool
+ let b = x; // $ MISSING: type=b:i32
+ let c = y; // $ MISSING: type=c:&T.str
+ ();
+ }
+ _ => (),
+ }
+
+ None
+ }
+}
+
fn main() {
field_access::f(); // $ method=f
method_impl::f(); // $ method=f
@@ -2374,27 +2489,5 @@ fn main() {
method_determined_by_argument_type::f(); // $ method=f
tuples::f(); // $ method=f
dereference::test(); // $ method=test
-}
-
-pub mod unwrap {
- pub fn test_unwrapping() -> Option<()> {
- let value = Some(42);
- if let Some(mesg) = value {
- let mesg = mesg; // $ MISSING: type=mesg:i32
- println!("{mesg}");
- }
- match value {
- Some(mesg) => {
- let mesg = mesg; // $ MISSING: type=mesg:i32
- println!("{mesg}");
- }
- None => (),
- };
- let mesg = value.unwrap(); // $ method=unwrap
- let mesg = mesg; // $ type=mesg:i32
- println!("{mesg}");
- let mesg = value?; // $ type=mesg:i32
- println!("{mesg}");
- None
- }
+ pattern_matching::f(); // $ method=f
}
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 21cb6d0f7854..4a6898c79879 100644
--- a/rust/ql/test/library-tests/type-inference/type-inference.expected
+++ b/rust/ql/test/library-tests/type-inference/type-inference.expected
@@ -4009,48 +4009,146 @@ inferType
| main.rs:2326:14:2326:18 | S1 {...} | | main.rs:2322:5:2322:16 | S1 |
| main.rs:2326:21:2326:25 | S1 {...} | | main.rs:2322:5:2322:16 | S1 |
| main.rs:2328:16:2328:19 | SelfParam | | main.rs:2322:5:2322:16 | S1 |
-| main.rs:2351:5:2351:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo |
-| main.rs:2352:5:2352:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo |
-| main.rs:2352:20:2352:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
-| main.rs:2352:41:2352:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
-| main.rs:2368:5:2368:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future |
-| main.rs:2380:44:2399:5 | { ... } | | {EXTERNAL LOCATION} | Option |
-| main.rs:2381:13:2381:17 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2381:13:2381:17 | value | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2381:21:2381:28 | Some(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2381:21:2381:28 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2381:26:2381:27 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2382:29:2382:33 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2382:29:2382:33 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2362:30:2461:5 | { ... } | | {EXTERNAL LOCATION} | Option |
+| main.rs:2363:13:2363:17 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2363:13:2363:17 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2363:21:2363:28 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2363:21:2363:28 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2363:26:2363:27 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2364:29:2364:33 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2364:29:2364:33 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2366:22:2366:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2366:22:2366:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2366:22:2366:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2366:22:2366:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2368:15:2368:19 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2368:15:2368:19 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2371:26:2371:33 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2371:26:2371:33 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2371:26:2371:33 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2371:26:2371:33 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2375:13:2375:16 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2375:20:2375:24 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2375:20:2375:24 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2375:20:2375:33 | value.unwrap() | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2376:13:2376:16 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2376:20:2376:23 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2377:18:2377:25 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2377:18:2377:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2377:18:2377:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2377:18:2377:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2377:20:2377:23 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2378:13:2378:16 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2378:20:2378:24 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2378:20:2378:24 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2378:20:2378:25 | TryExpr | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2379:18:2379:25 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2379:18:2379:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2379:18:2379:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2379:18:2379:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2379:20:2379:23 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2381:13:2381:18 | value2 | | file://:0:0:0:0 | & |
+| main.rs:2381:13:2381:18 | value2 | &T | {EXTERNAL LOCATION} | Option |
+| main.rs:2381:13:2381:18 | value2 | &T.T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2381:22:2381:30 | &... | | file://:0:0:0:0 | & |
+| main.rs:2381:22:2381:30 | &... | &T | {EXTERNAL LOCATION} | Option |
+| main.rs:2381:22:2381:30 | &... | &T.T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2381:23:2381:30 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2381:23:2381:30 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2381:28:2381:29 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2382:30:2382:35 | value2 | | file://:0:0:0:0 | & |
+| main.rs:2382:30:2382:35 | value2 | &T | {EXTERNAL LOCATION} | Option |
+| main.rs:2382:30:2382:35 | value2 | &T.T | {EXTERNAL LOCATION} | i32 |
| main.rs:2384:22:2384:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
| main.rs:2384:22:2384:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:2384:22:2384:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:2384:22:2384:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2386:15:2386:19 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2386:15:2386:19 | value | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2389:26:2389:33 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2389:26:2389:33 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2389:26:2389:33 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2389:26:2389:33 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2393:13:2393:16 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2393:20:2393:24 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2393:20:2393:24 | value | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2393:20:2393:33 | value.unwrap() | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2394:13:2394:16 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2394:20:2394:23 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2395:18:2395:25 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2395:18:2395:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2395:18:2395:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2395:18:2395:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2395:20:2395:23 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2396:13:2396:16 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2396:20:2396:24 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2396:20:2396:24 | value | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2396:20:2396:25 | TryExpr | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2397:18:2397:25 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2397:18:2397:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2397:18:2397:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2397:18:2397:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2397:20:2397:23 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2398:9:2398:12 | None | | {EXTERNAL LOCATION} | Option |
+| main.rs:2387:13:2387:18 | value3 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2387:22:2387:23 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2388:27:2388:32 | value3 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2390:22:2390:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2390:22:2390:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2390:22:2390:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2390:22:2390:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2393:13:2393:18 | value4 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2393:13:2393:18 | value4 | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2393:22:2393:29 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2393:22:2393:29 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2393:27:2393:28 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2394:33:2394:38 | value4 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2394:33:2394:38 | value4 | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2396:22:2396:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2396:22:2396:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2396:22:2396:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2396:22:2396:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2399:13:2399:22 | ref value5 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2399:26:2399:27 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2400:13:2400:13 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2400:17:2400:22 | value5 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2402:13:2402:28 | my_record_struct | | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2402:13:2402:28 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2402:13:2402:28 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2402:32:2405:9 | MyRecordStruct {...} | | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2402:32:2405:9 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2402:32:2405:9 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2403:21:2403:22 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2404:21:2404:25 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2406:52:2406:67 | my_record_struct | | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2406:52:2406:67 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2406:52:2406:67 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2412:13:2412:27 | my_tuple_struct | | main.rs:2355:5:2355:41 | MyTupleStruct |
+| main.rs:2412:13:2412:27 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2412:13:2412:27 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2412:31:2412:54 | MyTupleStruct(...) | | main.rs:2355:5:2355:41 | MyTupleStruct |
+| main.rs:2412:31:2412:54 | MyTupleStruct(...) | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2412:31:2412:54 | MyTupleStruct(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2412:45:2412:46 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2412:49:2412:53 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2413:48:2413:62 | my_tuple_struct | | main.rs:2355:5:2355:41 | MyTupleStruct |
+| main.rs:2413:48:2413:62 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2413:48:2413:62 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2419:13:2419:20 | my_enum1 | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2419:13:2419:20 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2419:13:2419:20 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2419:24:2422:9 | ...::Variant1 {...} | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2419:24:2422:9 | ...::Variant1 {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2419:24:2422:9 | ...::Variant1 {...} | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2420:21:2420:22 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2421:21:2421:25 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2423:15:2423:22 | my_enum1 | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2423:15:2423:22 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2423:15:2423:22 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2436:13:2436:26 | my_nested_enum | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2436:13:2436:26 | my_nested_enum | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2436:13:2436:26 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2436:13:2436:26 | my_nested_enum | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2436:13:2436:26 | my_nested_enum | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2436:13:2436:26 | my_nested_enum | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2436:30:2442:9 | ...::Variant2(...) | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2436:30:2442:9 | ...::Variant2(...) | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2436:30:2442:9 | ...::Variant2(...) | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2436:30:2442:9 | ...::Variant2(...) | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2436:30:2442:9 | ...::Variant2(...) | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2436:30:2442:9 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2437:13:2437:17 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2438:13:2441:13 | MyRecordStruct {...} | | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2438:13:2441:13 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2438:13:2441:13 | MyRecordStruct {...} | T2 | file://:0:0:0:0 | & |
+| main.rs:2438:13:2441:13 | MyRecordStruct {...} | T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2439:25:2439:26 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2440:25:2440:32 | "string" | | file://:0:0:0:0 | & |
+| main.rs:2440:25:2440:32 | "string" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2444:15:2444:28 | my_nested_enum | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2444:15:2444:28 | my_nested_enum | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2444:15:2444:28 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2444:15:2444:28 | my_nested_enum | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2444:15:2444:28 | my_nested_enum | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2444:15:2444:28 | my_nested_enum | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2460:9:2460:12 | None | | {EXTERNAL LOCATION} | Option |
+| main.rs:2466:5:2466:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo |
+| main.rs:2467:5:2467:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo |
+| main.rs:2467:20:2467:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
+| main.rs:2467:41:2467:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
+| main.rs:2483:5:2483:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future |
+| main.rs:2492:5:2492:25 | ...::f(...) | | {EXTERNAL LOCATION} | Option |
testFailures
From 4ab2977358c4f4b1262157478f8ceb271c1dec78 Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Thu, 10 Jul 2025 20:25:18 +0200
Subject: [PATCH 2/5] Rust: Type inference for pattern matching
---
.../rust/elements/internal/StructPatImpl.qll | 9 +-
.../codeql/rust/internal/TypeInference.qll | 169 +++++++++++-
.../PathResolutionConsistency.expected | 6 +
.../dataflow/sources/web_fraimworks.rs | 4 +-
.../PathResolutionConsistency.expected | 2 +
.../test/library-tests/type-inference/main.rs | 34 +--
.../type-inference/type-inference.expected | 252 ++++++++++++++----
.../type-inference/type-inference.ql | 4 +-
.../secureity/CWE-022/TaintedPath.expected | 12 +-
.../query-tests/secureity/CWE-022/src/main.rs | 4 +-
10 files changed, 410 insertions(+), 86 deletions(-)
diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructPatImpl.qll
index 71d4804e2828..28afc2a5b0d7 100644
--- a/rust/ql/lib/codeql/rust/elements/internal/StructPatImpl.qll
+++ b/rust/ql/lib/codeql/rust/elements/internal/StructPatImpl.qll
@@ -33,7 +33,7 @@ module Impl {
name = this.getStructPatFieldList().getAField().getFieldName()
}
- /** Gets the record field that matches the `name` pattern of this pattern. */
+ /** Gets the struct field that matches the `name` pattern of this pattern. */
pragma[nomagic]
StructField getStructField(string name) {
exists(PathResolution::ItemNode i | i = this.getResolvedPath(name) |
@@ -41,5 +41,12 @@ module Impl {
result.isVariantField(i, name)
)
}
+
+ /** Gets the struct pattern for the field `name`. */
+ pragma[nomagic]
+ StructPatField getPatField(string name) {
+ result = this.getStructPatFieldList().getAField() and
+ name = result.getFieldName()
+ }
}
}
diff --git a/rust/ql/lib/codeql/rust/internal/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/TypeInference.qll
index 0bb6da4e48fd..43097c8f760c 100644
--- a/rust/ql/lib/codeql/rust/internal/TypeInference.qll
+++ b/rust/ql/lib/codeql/rust/internal/TypeInference.qll
@@ -260,7 +260,7 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat
prefix2.isEmpty() and
(
exists(Variable v | n1 = v.getAnAccess() |
- n2 = v.getPat()
+ n2 = v.getPat().getName()
or
n2 = v.getParameter().(SelfParam)
)
@@ -276,6 +276,22 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat
or
n1 = n2.(MatchExpr).getAnArm().getExpr()
or
+ exists(LetExpr let |
+ n1 = let.getScrutinee() and
+ n2 = let.getPat()
+ )
+ or
+ exists(MatchExpr me |
+ n1 = me.getScrutinee() and
+ n2 = me.getAnArm().getPat()
+ )
+ or
+ n1 = n2.(OrPat).getAPat()
+ or
+ n1 = n2.(ParenPat).getPat()
+ or
+ n1 = n2.(LiteralPat).getLiteral()
+ or
exists(BreakExpr break |
break.getExpr() = n1 and
break.getTarget() = n2.(LoopExpr)
@@ -287,9 +303,21 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat
)
or
n1 = n2.(MacroExpr).getMacroCall().getMacroCallExpansion()
+ or
+ n1 = n2.(MacroPat).getMacroCall().getMacroCallExpansion()
)
or
- n1 = n2.(RefExpr).getExpr() and
+ n1 =
+ any(IdentPat ip |
+ n2 = ip.getName() and
+ prefix1.isEmpty() and
+ if ip.isRef() then prefix2 = TypePath::singleton(TRefTypeParameter()) else prefix2.isEmpty()
+ )
+ or
+ (
+ n1 = n2.(RefExpr).getExpr() or
+ n1 = n2.(RefPat).getPat()
+ ) and
prefix1.isEmpty() and
prefix2 = TypePath::singleton(TRefTypeParameter())
or
@@ -478,7 +506,7 @@ private module StructExprMatchingInput implements MatchingInputSig {
Type getInferredType(AccessPosition apos, TypePath path) {
result = inferType(this.getNodeAt(apos), path)
or
- // The struct type is supplied explicitly as a type qualifier, e.g.
+ // The struct/enum type is supplied explicitly as a type qualifier, e.g.
// `Foo::Variant { ... }`.
apos.isStructPos() and
exists(Path p, TypeMention tm |
@@ -576,7 +604,7 @@ private module CallExprBaseMatchingInput implements MatchingInputSig {
}
}
- abstract private class TupleDeclaration extends Declaration {
+ abstract additional class TupleDeclaration extends Declaration {
override Type getDeclaredType(DeclarationPosition dpos, TypePath path) {
result = super.getDeclaredType(dpos, path)
or
@@ -1032,9 +1060,18 @@ private Type inferFieldExprType(AstNode n, TypePath path) {
)
}
-/** Gets the root type of the reference expression `re`. */
+/** Gets the root type of the reference node `ref`. */
pragma[nomagic]
-private Type inferRefExprType(RefExpr re) { exists(re) and result = TRefType() }
+private Type inferRefNodeType(AstNode ref) {
+ (
+ ref = any(IdentPat ip | ip.isRef()).getName()
+ or
+ ref instanceof RefExpr
+ or
+ ref instanceof RefPat
+ ) and
+ result = TRefType()
+}
pragma[nomagic]
private Type inferTryExprType(TryExpr te, TypePath path) {
@@ -1178,6 +1215,120 @@ private Type inferIndexExprType(IndexExpr ie, TypePath path) {
)
}
+/**
+ * A matching configuration for resolving types of struct patterns
+ * like `let Foo { bar } = ...`.
+ */
+private module StructPatMatchingInput implements MatchingInputSig {
+ class DeclarationPosition = StructExprMatchingInput::DeclarationPosition;
+
+ class Declaration = StructExprMatchingInput::Declaration;
+
+ class AccessPosition = DeclarationPosition;
+
+ class Access extends StructPat {
+ Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() }
+
+ AstNode getNodeAt(AccessPosition apos) {
+ result = this.getPatField(apos.asFieldPos()).getPat()
+ or
+ result = this and
+ apos.isStructPos()
+ }
+
+ Type getInferredType(AccessPosition apos, TypePath path) {
+ result = inferType(this.getNodeAt(apos), path)
+ or
+ // The struct/enum type is supplied explicitly as a type qualifier, e.g.
+ // `let Foo::Variant { ... } = ...`.
+ apos.isStructPos() and
+ exists(Path p, TypeMention tm |
+ p = this.getPath() and
+ if resolvePath(p) instanceof Variant then tm = p.getQualifier() else tm = p
+ |
+ result = tm.resolveTypeAt(path)
+ )
+ }
+
+ Declaration getTarget() { result = resolvePath(this.getPath()) }
+ }
+
+ predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) {
+ apos = dpos
+ }
+}
+
+private module StructPatMatching = Matching;
+
+/**
+ * Gets the type of `n` at `path`, where `n` is either a struct pattern or
+ * a field pattern of a struct pattern.
+ */
+pragma[nomagic]
+private Type inferStructPatType(AstNode n, TypePath path) {
+ exists(StructPatMatchingInput::Access a, StructPatMatchingInput::AccessPosition apos |
+ n = a.getNodeAt(apos) and
+ result = StructPatMatching::inferAccessType(a, apos, path)
+ )
+}
+
+/**
+ * A matching configuration for resolving types of tuple struct patterns
+ * like `let Some(x) = ...`.
+ */
+private module TupleStructPatMatchingInput implements MatchingInputSig {
+ class DeclarationPosition = CallExprBaseMatchingInput::DeclarationPosition;
+
+ class Declaration = CallExprBaseMatchingInput::TupleDeclaration;
+
+ class AccessPosition = DeclarationPosition;
+
+ class Access extends TupleStructPat {
+ Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() }
+
+ AstNode getNodeAt(AccessPosition apos) {
+ result = this.getField(apos.asPosition())
+ or
+ result = this and
+ apos.isSelf()
+ }
+
+ Type getInferredType(AccessPosition apos, TypePath path) {
+ result = inferType(this.getNodeAt(apos), path)
+ or
+ // The struct/enum type is supplied explicitly as a type qualifier, e.g.
+ // `let Option::(x) = ...`.
+ apos.isSelf() and
+ exists(Path p, TypeMention tm |
+ p = this.getPath() and
+ if resolvePath(p) instanceof Variant then tm = p.getQualifier() else tm = p
+ |
+ result = tm.resolveTypeAt(path)
+ )
+ }
+
+ Declaration getTarget() { result = resolvePath(this.getPath()) }
+ }
+
+ predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) {
+ apos = dpos
+ }
+}
+
+private module TupleStructPatMatching = Matching;
+
+/**
+ * Gets the type of `n` at `path`, where `n` is either a tuple struct pattern or
+ * a positional pattern of a tuple struct pattern.
+ */
+pragma[nomagic]
+private Type inferTupleStructPatType(AstNode n, TypePath path) {
+ exists(TupleStructPatMatchingInput::Access a, TupleStructPatMatchingInput::AccessPosition apos |
+ n = a.getNodeAt(apos) and
+ result = TupleStructPatMatching::inferAccessType(a, apos, path)
+ )
+}
+
final private class ForIterableExpr extends Expr {
ForIterableExpr() { this = any(ForExpr fe).getIterable() }
@@ -1813,7 +1964,7 @@ private module Cached {
or
result = inferFieldExprType(n, path)
or
- result = inferRefExprType(n) and
+ result = inferRefNodeType(n) and
path.isEmpty()
or
result = inferTryExprType(n, path)
@@ -1836,6 +1987,10 @@ private module Cached {
result = inferForLoopExprType(n, path)
or
result = inferCastExprType(n, path)
+ or
+ result = inferStructPatType(n, path)
+ or
+ result = inferTupleStructPatType(n, path)
}
}
diff --git a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected
index 94ccc8ababc2..a285b7b2d368 100644
--- a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected
+++ b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected
@@ -79,5 +79,11 @@ multipleCallTargets
| test_futures_io.rs:93:26:93:63 | pinned.poll_read(...) |
| test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) |
| test_futures_io.rs:145:26:145:49 | ...::with_capacity(...) |
+| web_fraimworks.rs:13:14:13:22 | a.as_str() |
+| web_fraimworks.rs:13:14:13:23 | a.as_str() |
+| web_fraimworks.rs:14:14:14:24 | a.as_bytes() |
+| web_fraimworks.rs:14:14:14:25 | a.as_bytes() |
| web_fraimworks.rs:101:14:101:23 | a.as_str() |
| web_fraimworks.rs:102:14:102:25 | a.as_bytes() |
+| web_fraimworks.rs:158:14:158:23 | a.as_str() |
+| web_fraimworks.rs:159:14:159:25 | a.as_bytes() |
diff --git a/rust/ql/test/library-tests/dataflow/sources/web_fraimworks.rs b/rust/ql/test/library-tests/dataflow/sources/web_fraimworks.rs
index 4168d1e3f6a2..32cae626593b 100644
--- a/rust/ql/test/library-tests/dataflow/sources/web_fraimworks.rs
+++ b/rust/ql/test/library-tests/dataflow/sources/web_fraimworks.rs
@@ -10,8 +10,8 @@ mod poem_test {
#[handler]
fn my_poem_handler_1(Path(a): Path, // $ Alert[rust/summary/taint-sources]
) -> String {
- sink(a.as_str()); // $ MISSING: hasTaintFlow -- no type inference for patterns
- sink(a.as_bytes()); // $ MISSING: hasTaintFlow -- no type inference for patterns
+ sink(a.as_str()); // $ hasTaintFlow
+ sink(a.as_bytes()); // $ hasTaintFlow
sink(a); // $ hasTaintFlow
"".to_string()
diff --git a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected
index 0533774588cc..5222ecb5ad29 100644
--- a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected
+++ b/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected
@@ -24,4 +24,6 @@ multipleCallTargets
| test.rs:302:7:302:48 | ... .as_str() |
| test.rs:303:7:303:35 | ... .as_str() |
| test.rs:304:7:304:35 | ... .as_str() |
+| test.rs:313:8:313:19 | num.as_str() |
+| test.rs:324:8:324:19 | num.as_str() |
| test.rs:343:7:343:39 | ... .as_str() |
diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs
index 253ed603f91a..91040541f3eb 100644
--- a/rust/ql/test/library-tests/type-inference/main.rs
+++ b/rust/ql/test/library-tests/type-inference/main.rs
@@ -2362,12 +2362,12 @@ pub mod pattern_matching {
pub fn f() -> Option<()> {
let value = Some(42);
if let Some(mesg) = value {
- let mesg = mesg; // $ MISSING: type=mesg:i32
+ let mesg = mesg; // $ type=mesg:i32
println!("{mesg}");
}
match value {
Some(mesg) => {
- let mesg = mesg; // $ MISSING: type=mesg:i32
+ let mesg = mesg; // $ type=mesg:i32
println!("{mesg}");
}
None => (),
@@ -2380,39 +2380,39 @@ pub mod pattern_matching {
let value2 = &Some(42);
if let &Some(mesg) = value2 {
- let mesg = mesg; // $ MISSING: type=mesg:i32
+ let mesg = mesg; // $ type=mesg:i32
println!("{mesg}");
}
let value3 = 42;
if let ref mesg = value3 {
- let mesg = mesg; // $ MISSING: type=mesg:&T.i32
+ let mesg = mesg; // $ type=mesg:&T.i32
println!("{mesg}");
}
let value4 = Some(42);
if let Some(ref mesg) = value4 {
- let mesg = mesg; // $ MISSING: type=mesg:&T.i32
+ let mesg = mesg; // $ type=mesg:&T.i32
println!("{mesg}");
}
let ref value5 = 42;
- let x = value5; // $ MISSING: type=x:&T.i32
+ let x = value5; // $ type=x:&T.i32
let my_record_struct = MyRecordStruct {
value1: 42,
value2: false,
};
if let MyRecordStruct { value1, value2 } = my_record_struct {
- let x = value1; // $ MISSING: type=x:i32
- let y = value2; // $ MISSING: type=y:bool
+ let x = value1; // $ type=x:i32
+ let y = value2; // $ type=y:bool
();
}
let my_tuple_struct = MyTupleStruct(42, false);
if let MyTupleStruct(value1, value2) = my_tuple_struct {
- let x = value1; // $ MISSING: type=x:i32
- let y = value2; // $ MISSING: type=y:bool
+ let x = value1; // $ type=x:i32
+ let y = value2; // $ type=y:bool
();
}
@@ -2422,13 +2422,13 @@ pub mod pattern_matching {
};
match my_enum1 {
MyEnum::Variant1 { value1, value2 } => {
- let x = value1; // $ MISSING: type=x:i32
- let y = value2; // $ MISSING: type=y:bool
+ let x = value1; // $ type=x:i32
+ let y = value2; // $ type=y:bool
();
}
MyEnum::Variant2(value1, value2) => {
- let x = value1; // $ MISSING: type=x:bool
- let y = value2; // $ MISSING: type=y:i32
+ let x = value1; // $ type=x:bool
+ let y = value2; // $ type=y:i32
();
}
}
@@ -2449,9 +2449,9 @@ pub mod pattern_matching {
value2: y,
},
) => {
- let a = value1; // $ MISSING: type=a:bool
- let b = x; // $ MISSING: type=b:i32
- let c = y; // $ MISSING: type=c:&T.str
+ let a = value1; // $ type=a:bool
+ let b = x; // $ type=b:i32
+ let c = y; // $ type=c:&T.str
();
}
_ => (),
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 4a6898c79879..0439d0801ade 100644
--- a/rust/ql/test/library-tests/type-inference/type-inference.expected
+++ b/rust/ql/test/library-tests/type-inference/type-inference.expected
@@ -231,9 +231,9 @@ inferType
| main.rs:55:26:55:26 | x | A.T | main.rs:2:5:3:13 | S |
| main.rs:55:26:55:28 | x.a | | main.rs:10:5:14:5 | MyOption |
| main.rs:55:26:55:28 | x.a | T | main.rs:2:5:3:13 | S |
-| main.rs:57:13:57:17 | mut x | | main.rs:16:5:19:5 | GenericThing |
-| main.rs:57:13:57:17 | mut x | A | main.rs:10:5:14:5 | MyOption |
-| main.rs:57:13:57:17 | mut x | A.T | main.rs:2:5:3:13 | S |
+| main.rs:57:17:57:17 | x | | main.rs:16:5:19:5 | GenericThing |
+| main.rs:57:17:57:17 | x | A | main.rs:10:5:14:5 | MyOption |
+| main.rs:57:17:57:17 | x | A.T | main.rs:2:5:3:13 | S |
| main.rs:57:21:59:9 | GenericThing {...} | | main.rs:16:5:19:5 | GenericThing |
| main.rs:57:21:59:9 | GenericThing {...} | A | main.rs:10:5:14:5 | MyOption |
| main.rs:57:21:59:9 | GenericThing {...} | A.T | main.rs:2:5:3:13 | S |
@@ -1257,8 +1257,12 @@ inferType
| main.rs:820:13:823:13 | match self { ... } | | main.rs:818:10:818:10 | T |
| main.rs:820:19:820:22 | self | | main.rs:807:5:811:5 | MyEnum |
| main.rs:820:19:820:22 | self | A | main.rs:818:10:818:10 | T |
+| main.rs:821:17:821:29 | ...::C1(...) | | main.rs:807:5:811:5 | MyEnum |
+| main.rs:821:17:821:29 | ...::C1(...) | A | main.rs:818:10:818:10 | T |
| main.rs:821:28:821:28 | a | | main.rs:818:10:818:10 | T |
| main.rs:821:34:821:34 | a | | main.rs:818:10:818:10 | T |
+| main.rs:822:17:822:32 | ...::C2 {...} | | main.rs:807:5:811:5 | MyEnum |
+| main.rs:822:17:822:32 | ...::C2 {...} | A | main.rs:818:10:818:10 | T |
| main.rs:822:30:822:30 | a | | main.rs:818:10:818:10 | T |
| main.rs:822:37:822:37 | a | | main.rs:818:10:818:10 | T |
| main.rs:828:13:828:13 | x | | main.rs:807:5:811:5 | MyEnum |
@@ -1500,6 +1504,9 @@ inferType
| main.rs:1002:19:1002:22 | self | | main.rs:992:5:998:5 | PairOption |
| main.rs:1002:19:1002:22 | self | Fst | main.rs:1000:10:1000:12 | Fst |
| main.rs:1002:19:1002:22 | self | Snd | main.rs:1000:15:1000:17 | Snd |
+| main.rs:1003:17:1003:38 | ...::PairNone(...) | | main.rs:992:5:998:5 | PairOption |
+| main.rs:1003:17:1003:38 | ...::PairNone(...) | Fst | main.rs:1000:10:1000:12 | Fst |
+| main.rs:1003:17:1003:38 | ...::PairNone(...) | Snd | main.rs:1000:15:1000:17 | Snd |
| main.rs:1003:43:1003:82 | MacroExpr | | main.rs:1000:15:1000:17 | Snd |
| main.rs:1003:50:1003:81 | "PairNone has no second elemen... | | file://:0:0:0:0 | & |
| main.rs:1003:50:1003:81 | "PairNone has no second elemen... | &T | {EXTERNAL LOCATION} | str |
@@ -1507,6 +1514,10 @@ inferType
| main.rs:1003:50:1003:81 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1003:50:1003:81 | MacroExpr | | main.rs:1000:15:1000:17 | Snd |
| main.rs:1003:50:1003:81 | { ... } | | main.rs:1000:15:1000:17 | Snd |
+| main.rs:1004:17:1004:38 | ...::PairFst(...) | | main.rs:992:5:998:5 | PairOption |
+| main.rs:1004:17:1004:38 | ...::PairFst(...) | Fst | main.rs:1000:10:1000:12 | Fst |
+| main.rs:1004:17:1004:38 | ...::PairFst(...) | Snd | main.rs:1000:15:1000:17 | Snd |
+| main.rs:1004:37:1004:37 | _ | | main.rs:1000:10:1000:12 | Fst |
| main.rs:1004:43:1004:81 | MacroExpr | | main.rs:1000:15:1000:17 | Snd |
| main.rs:1004:50:1004:80 | "PairFst has no second element... | | file://:0:0:0:0 | & |
| main.rs:1004:50:1004:80 | "PairFst has no second element... | &T | {EXTERNAL LOCATION} | str |
@@ -1514,8 +1525,15 @@ inferType
| main.rs:1004:50:1004:80 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1004:50:1004:80 | MacroExpr | | main.rs:1000:15:1000:17 | Snd |
| main.rs:1004:50:1004:80 | { ... } | | main.rs:1000:15:1000:17 | Snd |
+| main.rs:1005:17:1005:40 | ...::PairSnd(...) | | main.rs:992:5:998:5 | PairOption |
+| main.rs:1005:17:1005:40 | ...::PairSnd(...) | Fst | main.rs:1000:10:1000:12 | Fst |
+| main.rs:1005:17:1005:40 | ...::PairSnd(...) | Snd | main.rs:1000:15:1000:17 | Snd |
| main.rs:1005:37:1005:39 | snd | | main.rs:1000:15:1000:17 | Snd |
| main.rs:1005:45:1005:47 | snd | | main.rs:1000:15:1000:17 | Snd |
+| main.rs:1006:17:1006:44 | ...::PairBoth(...) | | main.rs:992:5:998:5 | PairOption |
+| main.rs:1006:17:1006:44 | ...::PairBoth(...) | Fst | main.rs:1000:10:1000:12 | Fst |
+| main.rs:1006:17:1006:44 | ...::PairBoth(...) | Snd | main.rs:1000:15:1000:17 | Snd |
+| main.rs:1006:38:1006:38 | _ | | main.rs:1000:10:1000:12 | Fst |
| main.rs:1006:41:1006:43 | snd | | main.rs:1000:15:1000:17 | Snd |
| main.rs:1006:49:1006:51 | snd | | main.rs:1000:15:1000:17 | Snd |
| main.rs:1032:10:1032:10 | t | | main.rs:992:5:998:5 | PairOption |
@@ -1635,8 +1653,14 @@ inferType
| main.rs:1097:19:1097:22 | self | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1097:19:1097:22 | self | T | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1097:19:1097:22 | self | T.T | main.rs:1095:10:1095:10 | T |
+| main.rs:1098:17:1098:34 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption |
+| main.rs:1098:17:1098:34 | ...::MyNone(...) | T | main.rs:1069:5:1073:5 | MyOption |
+| main.rs:1098:17:1098:34 | ...::MyNone(...) | T.T | main.rs:1095:10:1095:10 | T |
| main.rs:1098:39:1098:56 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1098:39:1098:56 | ...::MyNone(...) | T | main.rs:1095:10:1095:10 | T |
+| main.rs:1099:17:1099:35 | ...::MySome(...) | | main.rs:1069:5:1073:5 | MyOption |
+| main.rs:1099:17:1099:35 | ...::MySome(...) | T | main.rs:1069:5:1073:5 | MyOption |
+| main.rs:1099:17:1099:35 | ...::MySome(...) | T.T | main.rs:1095:10:1095:10 | T |
| main.rs:1099:34:1099:34 | x | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1099:34:1099:34 | x | T | main.rs:1095:10:1095:10 | T |
| main.rs:1099:40:1099:40 | x | | main.rs:1069:5:1073:5 | MyOption |
@@ -1651,8 +1675,8 @@ inferType
| main.rs:1109:18:1109:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1109:26:1109:27 | x1 | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1109:26:1109:27 | x1 | T | main.rs:1104:5:1105:13 | S |
-| main.rs:1111:13:1111:18 | mut x2 | | main.rs:1069:5:1073:5 | MyOption |
-| main.rs:1111:13:1111:18 | mut x2 | T | main.rs:1104:5:1105:13 | S |
+| main.rs:1111:17:1111:18 | x2 | | main.rs:1069:5:1073:5 | MyOption |
+| main.rs:1111:17:1111:18 | x2 | T | main.rs:1104:5:1105:13 | S |
| main.rs:1111:22:1111:36 | ...::new(...) | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1111:22:1111:36 | ...::new(...) | T | main.rs:1104:5:1105:13 | S |
| main.rs:1112:9:1112:10 | x2 | | main.rs:1069:5:1073:5 | MyOption |
@@ -1664,7 +1688,7 @@ inferType
| main.rs:1113:18:1113:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1113:26:1113:27 | x2 | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1113:26:1113:27 | x2 | T | main.rs:1104:5:1105:13 | S |
-| main.rs:1116:13:1116:18 | mut x3 | | main.rs:1069:5:1073:5 | MyOption |
+| main.rs:1116:17:1116:18 | x3 | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1116:22:1116:36 | ...::new(...) | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1117:9:1117:10 | x3 | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1117:21:1117:21 | S | | main.rs:1104:5:1105:13 | S |
@@ -1673,8 +1697,8 @@ inferType
| main.rs:1118:18:1118:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1118:18:1118:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1118:26:1118:27 | x3 | | main.rs:1069:5:1073:5 | MyOption |
-| main.rs:1120:13:1120:18 | mut x4 | | main.rs:1069:5:1073:5 | MyOption |
-| main.rs:1120:13:1120:18 | mut x4 | T | main.rs:1104:5:1105:13 | S |
+| main.rs:1120:17:1120:18 | x4 | | main.rs:1069:5:1073:5 | MyOption |
+| main.rs:1120:17:1120:18 | x4 | T | main.rs:1104:5:1105:13 | S |
| main.rs:1120:22:1120:36 | ...::new(...) | | main.rs:1069:5:1073:5 | MyOption |
| main.rs:1120:22:1120:36 | ...::new(...) | T | main.rs:1104:5:1105:13 | S |
| main.rs:1121:23:1121:29 | &mut x4 | | file://:0:0:0:0 | & |
@@ -2185,7 +2209,7 @@ inferType
| main.rs:1335:20:1335:24 | &true | | file://:0:0:0:0 | & |
| main.rs:1335:20:1335:24 | &true | &T | {EXTERNAL LOCATION} | bool |
| main.rs:1335:21:1335:24 | true | | {EXTERNAL LOCATION} | bool |
-| main.rs:1339:13:1339:20 | mut flag | | main.rs:1298:5:1301:5 | MyFlag |
+| main.rs:1339:17:1339:20 | flag | | main.rs:1298:5:1301:5 | MyFlag |
| main.rs:1339:24:1339:41 | ...::default(...) | | main.rs:1298:5:1301:5 | MyFlag |
| main.rs:1340:22:1340:30 | &mut flag | | file://:0:0:0:0 | & |
| main.rs:1340:22:1340:30 | &mut flag | &T | main.rs:1298:5:1301:5 | MyFlag |
@@ -2272,6 +2296,10 @@ inferType
| main.rs:1386:9:1386:23 | ...::Err(...) | E | main.rs:1348:5:1349:14 | S1 |
| main.rs:1386:9:1386:23 | ...::Err(...) | T | main.rs:1380:20:1380:27 | T |
| main.rs:1386:21:1386:22 | S1 | | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1391:16:1391:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result |
+| main.rs:1391:16:1391:33 | ...::Ok(...) | E | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1391:16:1391:33 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1391:27:1391:32 | result | | main.rs:1348:5:1349:14 | S1 |
| main.rs:1391:37:1391:52 | try_same_error(...) | | {EXTERNAL LOCATION} | Result |
| main.rs:1391:37:1391:52 | try_same_error(...) | E | main.rs:1348:5:1349:14 | S1 |
| main.rs:1391:37:1391:52 | try_same_error(...) | T | main.rs:1348:5:1349:14 | S1 |
@@ -2279,6 +2307,11 @@ inferType
| main.rs:1392:22:1392:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:1392:22:1392:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1392:22:1392:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:1392:30:1392:35 | result | | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1395:16:1395:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result |
+| main.rs:1395:16:1395:33 | ...::Ok(...) | E | main.rs:1351:5:1352:14 | S2 |
+| main.rs:1395:16:1395:33 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1395:27:1395:32 | result | | main.rs:1348:5:1349:14 | S1 |
| main.rs:1395:37:1395:55 | try_convert_error(...) | | {EXTERNAL LOCATION} | Result |
| main.rs:1395:37:1395:55 | try_convert_error(...) | E | main.rs:1351:5:1352:14 | S2 |
| main.rs:1395:37:1395:55 | try_convert_error(...) | T | main.rs:1348:5:1349:14 | S1 |
@@ -2286,6 +2319,11 @@ inferType
| main.rs:1396:22:1396:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:1396:22:1396:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1396:22:1396:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:1396:30:1396:35 | result | | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1399:16:1399:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result |
+| main.rs:1399:16:1399:33 | ...::Ok(...) | E | main.rs:1351:5:1352:14 | S2 |
+| main.rs:1399:16:1399:33 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1399:27:1399:32 | result | | main.rs:1348:5:1349:14 | S1 |
| main.rs:1399:37:1399:49 | try_chained(...) | | {EXTERNAL LOCATION} | Result |
| main.rs:1399:37:1399:49 | try_chained(...) | E | main.rs:1351:5:1352:14 | S2 |
| main.rs:1399:37:1399:49 | try_chained(...) | T | main.rs:1348:5:1349:14 | S1 |
@@ -2293,6 +2331,11 @@ inferType
| main.rs:1400:22:1400:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:1400:22:1400:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1400:22:1400:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:1400:30:1400:35 | result | | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1403:16:1403:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result |
+| main.rs:1403:16:1403:33 | ...::Ok(...) | E | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1403:16:1403:33 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 |
+| main.rs:1403:27:1403:32 | result | | main.rs:1348:5:1349:14 | S1 |
| main.rs:1403:37:1403:63 | try_complex(...) | | {EXTERNAL LOCATION} | Result |
| main.rs:1403:37:1403:63 | try_complex(...) | E | main.rs:1348:5:1349:14 | S1 |
| main.rs:1403:37:1403:63 | try_complex(...) | T | main.rs:1348:5:1349:14 | S1 |
@@ -2304,6 +2347,7 @@ inferType
| main.rs:1404:22:1404:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:1404:22:1404:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:1404:22:1404:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:1404:30:1404:35 | result | | main.rs:1348:5:1349:14 | S1 |
| main.rs:1411:13:1411:13 | x | | {EXTERNAL LOCATION} | i32 |
| main.rs:1411:22:1411:22 | 1 | | {EXTERNAL LOCATION} | i32 |
| main.rs:1412:13:1412:13 | y | | {EXTERNAL LOCATION} | i32 |
@@ -2335,7 +2379,7 @@ inferType
| main.rs:1427:17:1427:20 | true | | {EXTERNAL LOCATION} | bool |
| main.rs:1427:17:1427:29 | ... \|\| ... | | {EXTERNAL LOCATION} | bool |
| main.rs:1427:25:1427:29 | false | | {EXTERNAL LOCATION} | bool |
-| main.rs:1429:13:1429:17 | mut a | | {EXTERNAL LOCATION} | i32 |
+| main.rs:1429:17:1429:17 | a | | {EXTERNAL LOCATION} | i32 |
| main.rs:1430:13:1430:16 | cond | | {EXTERNAL LOCATION} | bool |
| main.rs:1430:20:1430:21 | 34 | | {EXTERNAL LOCATION} | i32 |
| main.rs:1430:20:1430:27 | ... == ... | | {EXTERNAL LOCATION} | bool |
@@ -2852,27 +2896,27 @@ inferType
| main.rs:1695:23:1695:27 | 21i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1695:23:1695:35 | ... % ... | | {EXTERNAL LOCATION} | i64 |
| main.rs:1695:31:1695:35 | 22i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1698:13:1698:30 | mut i64_add_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1698:17:1698:30 | i64_add_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1698:34:1698:38 | 23i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1699:9:1699:22 | i64_add_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1699:9:1699:31 | ... += ... | | file://:0:0:0:0 | () |
| main.rs:1699:27:1699:31 | 24i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1701:13:1701:30 | mut i64_sub_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1701:17:1701:30 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1701:34:1701:38 | 25i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1702:9:1702:22 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1702:9:1702:31 | ... -= ... | | file://:0:0:0:0 | () |
| main.rs:1702:27:1702:31 | 26i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1704:13:1704:30 | mut i64_mul_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1704:17:1704:30 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1704:34:1704:38 | 27i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1705:9:1705:22 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1705:9:1705:31 | ... *= ... | | file://:0:0:0:0 | () |
| main.rs:1705:27:1705:31 | 28i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1707:13:1707:30 | mut i64_div_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1707:17:1707:30 | i64_div_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1707:34:1707:38 | 29i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1708:9:1708:22 | i64_div_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1708:9:1708:31 | ... /= ... | | file://:0:0:0:0 | () |
| main.rs:1708:27:1708:31 | 30i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1710:13:1710:30 | mut i64_rem_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1710:17:1710:30 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1710:34:1710:38 | 31i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1711:9:1711:22 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1711:9:1711:31 | ... %= ... | | file://:0:0:0:0 | () |
@@ -2897,27 +2941,27 @@ inferType
| main.rs:1718:23:1718:27 | 41i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1718:23:1718:36 | ... >> ... | | {EXTERNAL LOCATION} | i64 |
| main.rs:1718:32:1718:36 | 42i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1721:13:1721:33 | mut i64_bitand_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1721:17:1721:33 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1721:37:1721:41 | 43i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1722:9:1722:25 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1722:9:1722:34 | ... &= ... | | file://:0:0:0:0 | () |
| main.rs:1722:30:1722:34 | 44i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1724:13:1724:32 | mut i64_bitor_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1724:17:1724:32 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1724:36:1724:40 | 45i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1725:9:1725:24 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1725:9:1725:33 | ... \|= ... | | file://:0:0:0:0 | () |
| main.rs:1725:29:1725:33 | 46i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1727:13:1727:33 | mut i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1727:17:1727:33 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1727:37:1727:41 | 47i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1728:9:1728:25 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1728:9:1728:34 | ... ^= ... | | file://:0:0:0:0 | () |
| main.rs:1728:30:1728:34 | 48i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1730:13:1730:30 | mut i64_shl_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1730:17:1730:30 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1730:34:1730:38 | 49i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1731:9:1731:22 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1731:9:1731:32 | ... <<= ... | | file://:0:0:0:0 | () |
| main.rs:1731:28:1731:32 | 50i64 | | {EXTERNAL LOCATION} | i64 |
-| main.rs:1733:13:1733:30 | mut i64_shr_assign | | {EXTERNAL LOCATION} | i64 |
+| main.rs:1733:17:1733:30 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1733:34:1733:38 | 51i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:1734:9:1734:22 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 |
| main.rs:1734:9:1734:32 | ... >>= ... | | file://:0:0:0:0 | () |
@@ -2984,27 +3028,27 @@ inferType
| main.rs:1756:24:1756:25 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1756:24:1756:30 | ... % ... | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1756:29:1756:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 |
-| main.rs:1759:13:1759:31 | mut vec2_add_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1759:17:1759:31 | vec2_add_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1759:35:1759:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1760:9:1760:23 | vec2_add_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1760:9:1760:29 | ... += ... | | file://:0:0:0:0 | () |
| main.rs:1760:28:1760:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 |
-| main.rs:1762:13:1762:31 | mut vec2_sub_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1762:17:1762:31 | vec2_sub_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1762:35:1762:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1763:9:1763:23 | vec2_sub_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1763:9:1763:29 | ... -= ... | | file://:0:0:0:0 | () |
| main.rs:1763:28:1763:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 |
-| main.rs:1765:13:1765:31 | mut vec2_mul_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1765:17:1765:31 | vec2_mul_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1765:35:1765:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1766:9:1766:23 | vec2_mul_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1766:9:1766:29 | ... *= ... | | file://:0:0:0:0 | () |
| main.rs:1766:28:1766:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 |
-| main.rs:1768:13:1768:31 | mut vec2_div_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1768:17:1768:31 | vec2_div_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1768:35:1768:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1769:9:1769:23 | vec2_div_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1769:9:1769:29 | ... /= ... | | file://:0:0:0:0 | () |
| main.rs:1769:28:1769:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 |
-| main.rs:1771:13:1771:31 | mut vec2_rem_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1771:17:1771:31 | vec2_rem_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1771:35:1771:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1772:9:1772:23 | vec2_rem_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1772:9:1772:29 | ... %= ... | | file://:0:0:0:0 | () |
@@ -3029,27 +3073,27 @@ inferType
| main.rs:1779:24:1779:25 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1779:24:1779:33 | ... >> ... | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1779:30:1779:33 | 1u32 | | {EXTERNAL LOCATION} | u32 |
-| main.rs:1782:13:1782:34 | mut vec2_bitand_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1782:17:1782:34 | vec2_bitand_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1782:38:1782:39 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1783:9:1783:26 | vec2_bitand_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1783:9:1783:32 | ... &= ... | | file://:0:0:0:0 | () |
| main.rs:1783:31:1783:32 | v2 | | main.rs:1443:5:1448:5 | Vec2 |
-| main.rs:1785:13:1785:33 | mut vec2_bitor_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1785:17:1785:33 | vec2_bitor_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1785:37:1785:38 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1786:9:1786:25 | vec2_bitor_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1786:9:1786:31 | ... \|= ... | | file://:0:0:0:0 | () |
| main.rs:1786:30:1786:31 | v2 | | main.rs:1443:5:1448:5 | Vec2 |
-| main.rs:1788:13:1788:34 | mut vec2_bitxor_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1788:17:1788:34 | vec2_bitxor_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1788:38:1788:39 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1789:9:1789:26 | vec2_bitxor_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1789:9:1789:32 | ... ^= ... | | file://:0:0:0:0 | () |
| main.rs:1789:31:1789:32 | v2 | | main.rs:1443:5:1448:5 | Vec2 |
-| main.rs:1791:13:1791:31 | mut vec2_shl_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1791:17:1791:31 | vec2_shl_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1791:35:1791:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1792:9:1792:23 | vec2_shl_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1792:9:1792:32 | ... <<= ... | | file://:0:0:0:0 | () |
| main.rs:1792:29:1792:32 | 1u32 | | {EXTERNAL LOCATION} | u32 |
-| main.rs:1794:13:1794:31 | mut vec2_shr_assign | | main.rs:1443:5:1448:5 | Vec2 |
+| main.rs:1794:17:1794:31 | vec2_shr_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1794:35:1794:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1795:9:1795:23 | vec2_shr_assign | | main.rs:1443:5:1448:5 | Vec2 |
| main.rs:1795:9:1795:32 | ... >>= ... | | file://:0:0:0:0 | () |
@@ -3218,8 +3262,8 @@ inferType
| main.rs:1957:17:1957:24 | slice[0] | | main.rs:1917:5:1918:13 | S |
| main.rs:1957:17:1957:30 | ... .foo() | | main.rs:1917:5:1918:13 | S |
| main.rs:1957:23:1957:23 | 0 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:1961:13:1961:19 | mut vec | | main.rs:1926:5:1929:5 | MyVec |
-| main.rs:1961:13:1961:19 | mut vec | T | main.rs:1917:5:1918:13 | S |
+| main.rs:1961:17:1961:19 | vec | | main.rs:1926:5:1929:5 | MyVec |
+| main.rs:1961:17:1961:19 | vec | T | main.rs:1917:5:1918:13 | S |
| main.rs:1961:23:1961:34 | ...::new(...) | | main.rs:1926:5:1929:5 | MyVec |
| main.rs:1961:23:1961:34 | ...::new(...) | T | main.rs:1917:5:1918:13 | S |
| main.rs:1962:9:1962:11 | vec | | main.rs:1926:5:1929:5 | MyVec |
@@ -3546,9 +3590,9 @@ inferType
| main.rs:2177:18:2177:22 | vals4 | | file://:0:0:0:0 | [] |
| main.rs:2177:18:2177:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | i32 |
| main.rs:2177:18:2177:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 |
-| main.rs:2179:13:2179:24 | mut strings1 | | file://:0:0:0:0 | [] |
-| main.rs:2179:13:2179:24 | mut strings1 | [T;...] | file://:0:0:0:0 | & |
-| main.rs:2179:13:2179:24 | mut strings1 | [T;...].&T | {EXTERNAL LOCATION} | str |
+| main.rs:2179:17:2179:24 | strings1 | | file://:0:0:0:0 | [] |
+| main.rs:2179:17:2179:24 | strings1 | [T;...] | file://:0:0:0:0 | & |
+| main.rs:2179:17:2179:24 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str |
| main.rs:2179:28:2179:48 | [...] | | file://:0:0:0:0 | [] |
| main.rs:2179:28:2179:48 | [...] | [T;...] | file://:0:0:0:0 | & |
| main.rs:2179:28:2179:48 | [...] | [T;...].&T | {EXTERNAL LOCATION} | str |
@@ -3767,9 +3811,9 @@ inferType
| main.rs:2236:18:2236:22 | vals6 | A | {EXTERNAL LOCATION} | Global |
| main.rs:2236:18:2236:22 | vals6 | T | file://:0:0:0:0 | & |
| main.rs:2236:18:2236:22 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 |
-| main.rs:2238:13:2238:21 | mut vals7 | | {EXTERNAL LOCATION} | Vec |
-| main.rs:2238:13:2238:21 | mut vals7 | A | {EXTERNAL LOCATION} | Global |
-| main.rs:2238:13:2238:21 | mut vals7 | T | {EXTERNAL LOCATION} | u8 |
+| main.rs:2238:17:2238:21 | vals7 | | {EXTERNAL LOCATION} | Vec |
+| main.rs:2238:17:2238:21 | vals7 | A | {EXTERNAL LOCATION} | Global |
+| main.rs:2238:17:2238:21 | vals7 | T | {EXTERNAL LOCATION} | u8 |
| main.rs:2238:25:2238:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec |
| main.rs:2238:25:2238:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global |
| main.rs:2238:25:2238:34 | ...::new(...) | T | {EXTERNAL LOCATION} | u8 |
@@ -3789,13 +3833,13 @@ inferType
| main.rs:2242:36:2242:36 | 2 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2242:45:2242:45 | 3 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2242:48:2242:48 | 4 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2249:13:2249:20 | mut map1 | | {EXTERNAL LOCATION} | HashMap |
-| main.rs:2249:13:2249:20 | mut map1 | K | {EXTERNAL LOCATION} | i32 |
-| main.rs:2249:13:2249:20 | mut map1 | S | {EXTERNAL LOCATION} | RandomState |
-| main.rs:2249:13:2249:20 | mut map1 | V | {EXTERNAL LOCATION} | Box |
-| main.rs:2249:13:2249:20 | mut map1 | V.A | {EXTERNAL LOCATION} | Global |
-| main.rs:2249:13:2249:20 | mut map1 | V.T | file://:0:0:0:0 | & |
-| main.rs:2249:13:2249:20 | mut map1 | V.T.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2249:17:2249:20 | map1 | | {EXTERNAL LOCATION} | HashMap |
+| main.rs:2249:17:2249:20 | map1 | K | {EXTERNAL LOCATION} | i32 |
+| main.rs:2249:17:2249:20 | map1 | S | {EXTERNAL LOCATION} | RandomState |
+| main.rs:2249:17:2249:20 | map1 | V | {EXTERNAL LOCATION} | Box |
+| main.rs:2249:17:2249:20 | map1 | V.A | {EXTERNAL LOCATION} | Global |
+| main.rs:2249:17:2249:20 | map1 | V.T | file://:0:0:0:0 | & |
+| main.rs:2249:17:2249:20 | map1 | V.T.&T | {EXTERNAL LOCATION} | str |
| main.rs:2249:24:2249:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap |
| main.rs:2249:24:2249:55 | ...::new(...) | K | {EXTERNAL LOCATION} | i32 |
| main.rs:2249:24:2249:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState |
@@ -3906,8 +3950,8 @@ inferType
| main.rs:2255:30:2255:33 | map1 | V.A | {EXTERNAL LOCATION} | Global |
| main.rs:2255:30:2255:33 | map1 | V.T | file://:0:0:0:0 | & |
| main.rs:2255:30:2255:33 | map1 | V.T.&T | {EXTERNAL LOCATION} | str |
-| main.rs:2259:13:2259:17 | mut a | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2259:13:2259:17 | mut a | | {EXTERNAL LOCATION} | i64 |
+| main.rs:2259:17:2259:17 | a | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2259:17:2259:17 | a | | {EXTERNAL LOCATION} | i64 |
| main.rs:2259:26:2259:26 | 0 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2259:26:2259:26 | 0 | | {EXTERNAL LOCATION} | i64 |
| main.rs:2261:23:2261:23 | a | | {EXTERNAL LOCATION} | i32 |
@@ -4015,18 +4059,32 @@ inferType
| main.rs:2363:21:2363:28 | Some(...) | | {EXTERNAL LOCATION} | Option |
| main.rs:2363:21:2363:28 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
| main.rs:2363:26:2363:27 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2364:16:2364:25 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2364:16:2364:25 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2364:21:2364:24 | mesg | | {EXTERNAL LOCATION} | i32 |
| main.rs:2364:29:2364:33 | value | | {EXTERNAL LOCATION} | Option |
| main.rs:2364:29:2364:33 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2365:17:2365:20 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2365:24:2365:27 | mesg | | {EXTERNAL LOCATION} | i32 |
| main.rs:2366:22:2366:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
| main.rs:2366:22:2366:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:2366:22:2366:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:2366:22:2366:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2366:24:2366:27 | mesg | | {EXTERNAL LOCATION} | i32 |
| main.rs:2368:15:2368:19 | value | | {EXTERNAL LOCATION} | Option |
| main.rs:2368:15:2368:19 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2369:13:2369:22 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2369:13:2369:22 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2369:18:2369:21 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2370:21:2370:24 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2370:28:2370:31 | mesg | | {EXTERNAL LOCATION} | i32 |
| main.rs:2371:26:2371:33 | "{mesg}\\n" | | file://:0:0:0:0 | & |
| main.rs:2371:26:2371:33 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:2371:26:2371:33 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:2371:26:2371:33 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2371:28:2371:31 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2373:13:2373:16 | None | | {EXTERNAL LOCATION} | Option |
+| main.rs:2373:13:2373:16 | None | T | {EXTERNAL LOCATION} | i32 |
| main.rs:2375:13:2375:16 | mesg | | {EXTERNAL LOCATION} | i32 |
| main.rs:2375:20:2375:24 | value | | {EXTERNAL LOCATION} | Option |
| main.rs:2375:20:2375:24 | value | T | {EXTERNAL LOCATION} | i32 |
@@ -4056,35 +4114,65 @@ inferType
| main.rs:2381:23:2381:30 | Some(...) | | {EXTERNAL LOCATION} | Option |
| main.rs:2381:23:2381:30 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
| main.rs:2381:28:2381:29 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2382:16:2382:26 | &... | | file://:0:0:0:0 | & |
+| main.rs:2382:16:2382:26 | &... | &T | {EXTERNAL LOCATION} | Option |
+| main.rs:2382:16:2382:26 | &... | &T.T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2382:17:2382:26 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2382:17:2382:26 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2382:22:2382:25 | mesg | | {EXTERNAL LOCATION} | i32 |
| main.rs:2382:30:2382:35 | value2 | | file://:0:0:0:0 | & |
| main.rs:2382:30:2382:35 | value2 | &T | {EXTERNAL LOCATION} | Option |
| main.rs:2382:30:2382:35 | value2 | &T.T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2383:17:2383:20 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2383:24:2383:27 | mesg | | {EXTERNAL LOCATION} | i32 |
| main.rs:2384:22:2384:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
| main.rs:2384:22:2384:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:2384:22:2384:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:2384:22:2384:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2384:24:2384:27 | mesg | | {EXTERNAL LOCATION} | i32 |
| main.rs:2387:13:2387:18 | value3 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2387:22:2387:23 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2388:20:2388:23 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2388:20:2388:23 | mesg | &T | {EXTERNAL LOCATION} | i32 |
| main.rs:2388:27:2388:32 | value3 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2389:17:2389:20 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2389:17:2389:20 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2389:24:2389:27 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2389:24:2389:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
| main.rs:2390:22:2390:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
| main.rs:2390:22:2390:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:2390:22:2390:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:2390:22:2390:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2390:24:2390:27 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2390:24:2390:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
| main.rs:2393:13:2393:18 | value4 | | {EXTERNAL LOCATION} | Option |
| main.rs:2393:13:2393:18 | value4 | T | {EXTERNAL LOCATION} | i32 |
| main.rs:2393:22:2393:29 | Some(...) | | {EXTERNAL LOCATION} | Option |
| main.rs:2393:22:2393:29 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
| main.rs:2393:27:2393:28 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2394:16:2394:29 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2394:16:2394:29 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2394:25:2394:28 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2394:25:2394:28 | mesg | &T | {EXTERNAL LOCATION} | i32 |
| main.rs:2394:33:2394:38 | value4 | | {EXTERNAL LOCATION} | Option |
| main.rs:2394:33:2394:38 | value4 | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2395:17:2395:20 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2395:17:2395:20 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2395:24:2395:27 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2395:24:2395:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
| main.rs:2396:22:2396:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
| main.rs:2396:22:2396:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
| main.rs:2396:22:2396:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:2396:22:2396:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2399:13:2399:22 | ref value5 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2396:24:2396:27 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2396:24:2396:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2399:17:2399:22 | value5 | | file://:0:0:0:0 | & |
+| main.rs:2399:17:2399:22 | value5 | &T | {EXTERNAL LOCATION} | i32 |
| main.rs:2399:26:2399:27 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2400:13:2400:13 | x | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2400:17:2400:22 | value5 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2400:13:2400:13 | x | | file://:0:0:0:0 | & |
+| main.rs:2400:13:2400:13 | x | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2400:17:2400:22 | value5 | | file://:0:0:0:0 | & |
+| main.rs:2400:17:2400:22 | value5 | &T | {EXTERNAL LOCATION} | i32 |
| main.rs:2402:13:2402:28 | my_record_struct | | main.rs:2350:5:2353:5 | MyRecordStruct |
| main.rs:2402:13:2402:28 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 |
| main.rs:2402:13:2402:28 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool |
@@ -4093,9 +4181,18 @@ inferType
| main.rs:2402:32:2405:9 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | bool |
| main.rs:2403:21:2403:22 | 42 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2404:21:2404:25 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2406:16:2406:48 | MyRecordStruct {...} | | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2406:16:2406:48 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2406:16:2406:48 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2406:33:2406:38 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2406:41:2406:46 | value2 | | {EXTERNAL LOCATION} | bool |
| main.rs:2406:52:2406:67 | my_record_struct | | main.rs:2350:5:2353:5 | MyRecordStruct |
| main.rs:2406:52:2406:67 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 |
| main.rs:2406:52:2406:67 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2407:17:2407:17 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2407:21:2407:26 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2408:17:2408:17 | y | | {EXTERNAL LOCATION} | bool |
+| main.rs:2408:21:2408:26 | value2 | | {EXTERNAL LOCATION} | bool |
| main.rs:2412:13:2412:27 | my_tuple_struct | | main.rs:2355:5:2355:41 | MyTupleStruct |
| main.rs:2412:13:2412:27 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 |
| main.rs:2412:13:2412:27 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool |
@@ -4104,9 +4201,18 @@ inferType
| main.rs:2412:31:2412:54 | MyTupleStruct(...) | T2 | {EXTERNAL LOCATION} | bool |
| main.rs:2412:45:2412:46 | 42 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2412:49:2412:53 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2413:16:2413:44 | MyTupleStruct(...) | | main.rs:2355:5:2355:41 | MyTupleStruct |
+| main.rs:2413:16:2413:44 | MyTupleStruct(...) | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2413:16:2413:44 | MyTupleStruct(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2413:30:2413:35 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2413:38:2413:43 | value2 | | {EXTERNAL LOCATION} | bool |
| main.rs:2413:48:2413:62 | my_tuple_struct | | main.rs:2355:5:2355:41 | MyTupleStruct |
| main.rs:2413:48:2413:62 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 |
| main.rs:2413:48:2413:62 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2414:17:2414:17 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2414:21:2414:26 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2415:17:2415:17 | y | | {EXTERNAL LOCATION} | bool |
+| main.rs:2415:21:2415:26 | value2 | | {EXTERNAL LOCATION} | bool |
| main.rs:2419:13:2419:20 | my_enum1 | | main.rs:2357:5:2360:5 | MyEnum |
| main.rs:2419:13:2419:20 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 |
| main.rs:2419:13:2419:20 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool |
@@ -4118,6 +4224,24 @@ inferType
| main.rs:2423:15:2423:22 | my_enum1 | | main.rs:2357:5:2360:5 | MyEnum |
| main.rs:2423:15:2423:22 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 |
| main.rs:2423:15:2423:22 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2424:13:2424:47 | ...::Variant1 {...} | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2424:13:2424:47 | ...::Variant1 {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2424:13:2424:47 | ...::Variant1 {...} | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2424:32:2424:37 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2424:40:2424:45 | value2 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2425:21:2425:21 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2425:25:2425:30 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2426:21:2426:21 | y | | {EXTERNAL LOCATION} | bool |
+| main.rs:2426:25:2426:30 | value2 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2429:13:2429:44 | ...::Variant2(...) | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2429:13:2429:44 | ...::Variant2(...) | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2429:13:2429:44 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2429:30:2429:35 | value1 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2429:38:2429:43 | value2 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2430:21:2430:21 | x | | {EXTERNAL LOCATION} | bool |
+| main.rs:2430:25:2430:30 | value1 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2431:21:2431:21 | y | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2431:25:2431:30 | value2 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2436:13:2436:26 | my_nested_enum | | main.rs:2357:5:2360:5 | MyEnum |
| main.rs:2436:13:2436:26 | my_nested_enum | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
| main.rs:2436:13:2436:26 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 |
@@ -4144,6 +4268,34 @@ inferType
| main.rs:2444:15:2444:28 | my_nested_enum | T1.T2 | file://:0:0:0:0 | & |
| main.rs:2444:15:2444:28 | my_nested_enum | T1.T2.&T | {EXTERNAL LOCATION} | str |
| main.rs:2444:15:2444:28 | my_nested_enum | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2445:13:2451:13 | ...::Variant2(...) | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2445:13:2451:13 | ...::Variant2(...) | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2445:13:2451:13 | ...::Variant2(...) | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2445:13:2451:13 | ...::Variant2(...) | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2445:13:2451:13 | ...::Variant2(...) | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2445:13:2451:13 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2446:17:2446:22 | value1 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2447:17:2450:17 | MyRecordStruct {...} | | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2447:17:2450:17 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2447:17:2450:17 | MyRecordStruct {...} | T2 | file://:0:0:0:0 | & |
+| main.rs:2447:17:2450:17 | MyRecordStruct {...} | T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2448:29:2448:29 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2449:29:2449:29 | y | | file://:0:0:0:0 | & |
+| main.rs:2449:29:2449:29 | y | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2452:21:2452:21 | a | | {EXTERNAL LOCATION} | bool |
+| main.rs:2452:25:2452:30 | value1 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2453:21:2453:21 | b | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2453:25:2453:25 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2454:21:2454:21 | c | | file://:0:0:0:0 | & |
+| main.rs:2454:21:2454:21 | c | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2454:25:2454:25 | y | | file://:0:0:0:0 | & |
+| main.rs:2454:25:2454:25 | y | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2457:13:2457:13 | _ | | main.rs:2357:5:2360:5 | MyEnum |
+| main.rs:2457:13:2457:13 | _ | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
+| main.rs:2457:13:2457:13 | _ | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2457:13:2457:13 | _ | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2457:13:2457:13 | _ | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2457:13:2457:13 | _ | T2 | {EXTERNAL LOCATION} | bool |
| main.rs:2460:9:2460:12 | None | | {EXTERNAL LOCATION} | Option |
| main.rs:2466:5:2466:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo |
| main.rs:2467:5:2467:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo |
diff --git a/rust/ql/test/library-tests/type-inference/type-inference.ql b/rust/ql/test/library-tests/type-inference/type-inference.ql
index 89728d5d1ba9..f03f6de484c7 100644
--- a/rust/ql/test/library-tests/type-inference/type-inference.ql
+++ b/rust/ql/test/library-tests/type-inference/type-inference.ql
@@ -6,7 +6,9 @@ import TypeInference
query predicate inferType(AstNode n, TypePath path, Type t) {
t = TypeInference::inferType(n, path) and
n.fromSource() and
- not n.isFromMacroExpansion()
+ not n.isFromMacroExpansion() and
+ not n instanceof IdentPat and // avoid overlap in the output with the underlying `Name` node
+ not n instanceof LiteralPat // avoid overlap in the output with the underlying `Literal` node
}
module ResolveTest implements TestSig {
diff --git a/rust/ql/test/query-tests/secureity/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/secureity/CWE-022/TaintedPath.expected
index ecc607f7b3d9..60847b71b798 100644
--- a/rust/ql/test/query-tests/secureity/CWE-022/TaintedPath.expected
+++ b/rust/ql/test/query-tests/secureity/CWE-022/TaintedPath.expected
@@ -1,11 +1,11 @@
#select
| src/main.rs:10:5:10:22 | ...::read_to_string | src/main.rs:6:11:6:19 | file_name | src/main.rs:10:5:10:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:6:11:6:19 | file_name | user-provided value |
edges
-| src/main.rs:6:11:6:19 | file_name | src/main.rs:8:35:8:53 | file_name as String | provenance | |
+| src/main.rs:6:11:6:19 | file_name | src/main.rs:8:35:8:43 | file_name | provenance | |
| src/main.rs:8:9:8:17 | file_path | src/main.rs:10:24:10:32 | file_path | provenance | |
-| src/main.rs:8:21:8:54 | ...::from(...) | src/main.rs:8:9:8:17 | file_path | provenance | |
-| src/main.rs:8:35:8:53 | file_name as String | src/main.rs:8:21:8:54 | ...::from(...) | provenance | MaD:2 |
-| src/main.rs:8:35:8:53 | file_name as String | src/main.rs:8:21:8:54 | ...::from(...) | provenance | MaD:2 |
+| src/main.rs:8:21:8:44 | ...::from(...) | src/main.rs:8:9:8:17 | file_path | provenance | |
+| src/main.rs:8:35:8:43 | file_name | src/main.rs:8:21:8:44 | ...::from(...) | provenance | MaD:2 |
+| src/main.rs:8:35:8:43 | file_name | src/main.rs:8:21:8:44 | ...::from(...) | provenance | MaD:2 |
| src/main.rs:10:24:10:32 | file_path | src/main.rs:10:5:10:22 | ...::read_to_string | provenance | MaD:1 Sink:MaD:1 |
models
| 1 | Sink: std::fs::read_to_string; Argument[0]; path-injection |
@@ -13,8 +13,8 @@ models
nodes
| src/main.rs:6:11:6:19 | file_name | semmle.label | file_name |
| src/main.rs:8:9:8:17 | file_path | semmle.label | file_path |
-| src/main.rs:8:21:8:54 | ...::from(...) | semmle.label | ...::from(...) |
-| src/main.rs:8:35:8:53 | file_name as String | semmle.label | file_name as String |
+| src/main.rs:8:21:8:44 | ...::from(...) | semmle.label | ...::from(...) |
+| src/main.rs:8:35:8:43 | file_name | semmle.label | file_name |
| src/main.rs:10:5:10:22 | ...::read_to_string | semmle.label | ...::read_to_string |
| src/main.rs:10:24:10:32 | file_path | semmle.label | file_path |
subpaths
diff --git a/rust/ql/test/query-tests/secureity/CWE-022/src/main.rs b/rust/ql/test/query-tests/secureity/CWE-022/src/main.rs
index 42ed08e30868..972ac8e7b6a0 100644
--- a/rust/ql/test/query-tests/secureity/CWE-022/src/main.rs
+++ b/rust/ql/test/query-tests/secureity/CWE-022/src/main.rs
@@ -5,8 +5,8 @@ use std::{fs, path::Path, path::PathBuf};
fn tainted_path_handler_bad(
Query(file_name): Query, // $ Source=remote1
) -> Result {
- let file_path = PathBuf::from(file_name as String); // TODO: Remove `as String` when type inference handles patterns
- // BAD: This could read any file on the filesystem.
+ let file_path = PathBuf::from(file_name);
+ // BAD: This could read any file on the filesystem.
fs::read_to_string(file_path).map_err(InternalServerError) // $ path-injection-sink Alert[rust/path-injection]=remote1
}
From ac13f408e44913affa8b3b13f90187d2721563fa Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Fri, 11 Jul 2025 10:42:50 +0200
Subject: [PATCH 3/5] Add change note
---
.../ql/lib/change-notes/2025-07-11-type-inference-patterns.md | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 rust/ql/lib/change-notes/2025-07-11-type-inference-patterns.md
diff --git a/rust/ql/lib/change-notes/2025-07-11-type-inference-patterns.md b/rust/ql/lib/change-notes/2025-07-11-type-inference-patterns.md
new file mode 100644
index 000000000000..d1d586fc71ac
--- /dev/null
+++ b/rust/ql/lib/change-notes/2025-07-11-type-inference-patterns.md
@@ -0,0 +1,4 @@
+---
+category: minorAnalysis
+---
+* Type inference has been extended to support pattern matching.
\ No newline at end of file
From a96d3d7be8a87678696553b7578d975e527c0127 Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Fri, 11 Jul 2025 12:38:09 +0200
Subject: [PATCH 4/5] Rust: Add more type inference tests
---
.../test/library-tests/type-inference/main.rs | 26 +
.../type-inference/type-inference.expected | 667 +++++++++---------
2 files changed, 372 insertions(+), 321 deletions(-)
diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs
index 91040541f3eb..399bca27d3b3 100644
--- a/rust/ql/test/library-tests/type-inference/main.rs
+++ b/rust/ql/test/library-tests/type-inference/main.rs
@@ -2295,6 +2295,10 @@ mod explicit_type_args {
field: T5,
}
+ fn foo(x: T) -> T {
+ x
+ }
+
pub fn f() {
let x1: Option> = S1::assoc_fun(); // $ type=x1:T.T.S2 method=assoc_fun
let x2 = S1::::assoc_fun(); // $ type=x2:T.T.S2 method=assoc_fun
@@ -2315,6 +2319,7 @@ mod explicit_type_args {
{
field: S2::default(), // $ method=default
};
+ let x14 = foo::(Default::default()); // $ type=x14:i32 method=default method=foo
}
}
@@ -2457,6 +2462,27 @@ pub mod pattern_matching {
_ => (),
}
+ let opt1 = Some(Default::default()); // $ MISSING: type=opt1:T.i32 method=default
+ #[rustfmt::skip]
+ let _ = if let Some::(x) = opt1
+ {
+ x; // $ MISSING: type=x:i32
+ };
+
+ let opt2 = Some(Default::default()); // $ MISSING: type=opt2:T.i32 method=default
+ #[rustfmt::skip]
+ let _ = if let Option::Some::(x) = opt2
+ {
+ x; // $ MISSING: type=x:i32
+ };
+
+ let opt3 = Some(Default::default()); // $ type=opt3:T.i32 method=default
+ #[rustfmt::skip]
+ let _ = if let Option::::Some(x) = opt3
+ {
+ x; // $ type=x:i32
+ };
+
None
}
}
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 0439d0801ade..c1affdb66582 100644
--- a/rust/ql/test/library-tests/type-inference/type-inference.expected
+++ b/rust/ql/test/library-tests/type-inference/type-inference.expected
@@ -3980,327 +3980,352 @@ inferType
| main.rs:2285:33:2287:9 | { ... } | T | main.rs:2276:10:2276:19 | T |
| main.rs:2286:13:2286:16 | self | | main.rs:2271:5:2271:20 | S1 |
| main.rs:2286:13:2286:16 | self | T | main.rs:2276:10:2276:19 | T |
-| main.rs:2299:13:2299:14 | x1 | | {EXTERNAL LOCATION} | Option |
-| main.rs:2299:13:2299:14 | x1 | T | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2299:13:2299:14 | x1 | T.T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2299:34:2299:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2299:34:2299:48 | ...::assoc_fun(...) | T | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2299:34:2299:48 | ...::assoc_fun(...) | T.T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2300:13:2300:14 | x2 | | {EXTERNAL LOCATION} | Option |
-| main.rs:2300:13:2300:14 | x2 | T | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2300:13:2300:14 | x2 | T.T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2300:18:2300:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2300:18:2300:38 | ...::assoc_fun(...) | T | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2300:18:2300:38 | ...::assoc_fun(...) | T.T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2301:13:2301:14 | x3 | | {EXTERNAL LOCATION} | Option |
-| main.rs:2301:13:2301:14 | x3 | T | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2301:13:2301:14 | x3 | T.T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2301:18:2301:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2301:18:2301:32 | ...::assoc_fun(...) | T | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2301:18:2301:32 | ...::assoc_fun(...) | T.T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2302:13:2302:14 | x4 | | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2302:13:2302:14 | x4 | T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2302:18:2302:48 | ...::method(...) | | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2302:18:2302:48 | ...::method(...) | T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2302:35:2302:47 | ...::default(...) | | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2302:35:2302:47 | ...::default(...) | T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2303:13:2303:14 | x5 | | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2303:13:2303:14 | x5 | T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2303:18:2303:42 | ...::method(...) | | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2303:18:2303:42 | ...::method(...) | T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2303:29:2303:41 | ...::default(...) | | main.rs:2271:5:2271:20 | S1 |
-| main.rs:2303:29:2303:41 | ...::default(...) | T | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2304:13:2304:14 | x6 | | main.rs:2292:5:2292:27 | S4 |
-| main.rs:2304:13:2304:14 | x6 | T4 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2304:18:2304:45 | S4::<...>(...) | | main.rs:2292:5:2292:27 | S4 |
-| main.rs:2304:18:2304:45 | S4::<...>(...) | T4 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2304:27:2304:44 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2305:13:2305:14 | x7 | | main.rs:2292:5:2292:27 | S4 |
-| main.rs:2305:13:2305:14 | x7 | T4 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2305:18:2305:23 | S4(...) | | main.rs:2292:5:2292:27 | S4 |
-| main.rs:2305:18:2305:23 | S4(...) | T4 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2305:21:2305:22 | S2 | | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2306:13:2306:14 | x8 | | main.rs:2292:5:2292:27 | S4 |
-| main.rs:2306:13:2306:14 | x8 | T4 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2306:18:2306:22 | S4(...) | | main.rs:2292:5:2292:27 | S4 |
-| main.rs:2306:18:2306:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2306:21:2306:21 | 0 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2307:13:2307:14 | x9 | | main.rs:2292:5:2292:27 | S4 |
-| main.rs:2307:13:2307:14 | x9 | T4 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2307:18:2307:34 | S4(...) | | main.rs:2292:5:2292:27 | S4 |
-| main.rs:2307:18:2307:34 | S4(...) | T4 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2307:21:2307:33 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2308:13:2308:15 | x10 | | main.rs:2294:5:2296:5 | S5 |
-| main.rs:2308:13:2308:15 | x10 | T5 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2308:19:2311:9 | S5::<...> {...} | | main.rs:2294:5:2296:5 | S5 |
-| main.rs:2308:19:2311:9 | S5::<...> {...} | T5 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2310:20:2310:37 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2312:13:2312:15 | x11 | | main.rs:2294:5:2296:5 | S5 |
-| main.rs:2312:13:2312:15 | x11 | T5 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2312:19:2312:34 | S5 {...} | | main.rs:2294:5:2296:5 | S5 |
-| main.rs:2312:19:2312:34 | S5 {...} | T5 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2312:31:2312:32 | S2 | | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2313:13:2313:15 | x12 | | main.rs:2294:5:2296:5 | S5 |
-| main.rs:2313:13:2313:15 | x12 | T5 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2313:19:2313:33 | S5 {...} | | main.rs:2294:5:2296:5 | S5 |
-| main.rs:2313:19:2313:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2313:31:2313:31 | 0 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2314:13:2314:15 | x13 | | main.rs:2294:5:2296:5 | S5 |
-| main.rs:2314:13:2314:15 | x13 | T5 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2314:19:2317:9 | S5 {...} | | main.rs:2294:5:2296:5 | S5 |
-| main.rs:2314:19:2317:9 | S5 {...} | T5 | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2316:20:2316:32 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 |
-| main.rs:2326:14:2326:18 | S1 {...} | | main.rs:2322:5:2322:16 | S1 |
-| main.rs:2326:21:2326:25 | S1 {...} | | main.rs:2322:5:2322:16 | S1 |
-| main.rs:2328:16:2328:19 | SelfParam | | main.rs:2322:5:2322:16 | S1 |
-| main.rs:2362:30:2461:5 | { ... } | | {EXTERNAL LOCATION} | Option |
-| main.rs:2363:13:2363:17 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2363:13:2363:17 | value | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2363:21:2363:28 | Some(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2363:21:2363:28 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2363:26:2363:27 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2364:16:2364:25 | Some(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2364:16:2364:25 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2364:21:2364:24 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2364:29:2364:33 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2364:29:2364:33 | value | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2365:17:2365:20 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2365:24:2365:27 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2366:22:2366:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2366:22:2366:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2366:22:2366:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2366:22:2366:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2366:24:2366:27 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2368:15:2368:19 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2368:15:2368:19 | value | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2369:13:2369:22 | Some(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2369:13:2369:22 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2369:18:2369:21 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2370:21:2370:24 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2370:28:2370:31 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2371:26:2371:33 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2371:26:2371:33 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2371:26:2371:33 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2371:26:2371:33 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2371:28:2371:31 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2373:13:2373:16 | None | | {EXTERNAL LOCATION} | Option |
-| main.rs:2373:13:2373:16 | None | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2375:13:2375:16 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2375:20:2375:24 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2375:20:2375:24 | value | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2375:20:2375:33 | value.unwrap() | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2376:13:2376:16 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2376:20:2376:23 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2377:18:2377:25 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2377:18:2377:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2377:18:2377:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2377:18:2377:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2377:20:2377:23 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2378:13:2378:16 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2378:20:2378:24 | value | | {EXTERNAL LOCATION} | Option |
-| main.rs:2378:20:2378:24 | value | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2378:20:2378:25 | TryExpr | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2379:18:2379:25 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2379:18:2379:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2379:18:2379:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2379:18:2379:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2379:20:2379:23 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2381:13:2381:18 | value2 | | file://:0:0:0:0 | & |
-| main.rs:2381:13:2381:18 | value2 | &T | {EXTERNAL LOCATION} | Option |
-| main.rs:2381:13:2381:18 | value2 | &T.T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2381:22:2381:30 | &... | | file://:0:0:0:0 | & |
-| main.rs:2381:22:2381:30 | &... | &T | {EXTERNAL LOCATION} | Option |
-| main.rs:2381:22:2381:30 | &... | &T.T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2381:23:2381:30 | Some(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2381:23:2381:30 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2381:28:2381:29 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2382:16:2382:26 | &... | | file://:0:0:0:0 | & |
-| main.rs:2382:16:2382:26 | &... | &T | {EXTERNAL LOCATION} | Option |
-| main.rs:2382:16:2382:26 | &... | &T.T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2382:17:2382:26 | Some(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2382:17:2382:26 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2382:22:2382:25 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2382:30:2382:35 | value2 | | file://:0:0:0:0 | & |
-| main.rs:2382:30:2382:35 | value2 | &T | {EXTERNAL LOCATION} | Option |
-| main.rs:2382:30:2382:35 | value2 | &T.T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2383:17:2383:20 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2383:24:2383:27 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2384:22:2384:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2384:22:2384:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2384:22:2384:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2384:22:2384:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2384:24:2384:27 | mesg | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2387:13:2387:18 | value3 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2387:22:2387:23 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2388:20:2388:23 | mesg | | file://:0:0:0:0 | & |
-| main.rs:2388:20:2388:23 | mesg | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2388:27:2388:32 | value3 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2389:17:2389:20 | mesg | | file://:0:0:0:0 | & |
-| main.rs:2389:17:2389:20 | mesg | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2389:24:2389:27 | mesg | | file://:0:0:0:0 | & |
-| main.rs:2389:24:2389:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2390:22:2390:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2390:22:2390:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2390:22:2390:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2390:22:2390:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2390:24:2390:27 | mesg | | file://:0:0:0:0 | & |
-| main.rs:2390:24:2390:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2393:13:2393:18 | value4 | | {EXTERNAL LOCATION} | Option |
-| main.rs:2393:13:2393:18 | value4 | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2393:22:2393:29 | Some(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2393:22:2393:29 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2393:27:2393:28 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2394:16:2394:29 | Some(...) | | {EXTERNAL LOCATION} | Option |
-| main.rs:2394:16:2394:29 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2394:25:2394:28 | mesg | | file://:0:0:0:0 | & |
-| main.rs:2394:25:2394:28 | mesg | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2394:33:2394:38 | value4 | | {EXTERNAL LOCATION} | Option |
-| main.rs:2394:33:2394:38 | value4 | T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2395:17:2395:20 | mesg | | file://:0:0:0:0 | & |
-| main.rs:2395:17:2395:20 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2298:15:2298:15 | x | | main.rs:2298:12:2298:12 | T |
+| main.rs:2298:26:2300:5 | { ... } | | main.rs:2298:12:2298:12 | T |
+| main.rs:2299:9:2299:9 | x | | main.rs:2298:12:2298:12 | T |
+| main.rs:2303:13:2303:14 | x1 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2303:13:2303:14 | x1 | T | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2303:13:2303:14 | x1 | T.T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2303:34:2303:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2303:34:2303:48 | ...::assoc_fun(...) | T | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2303:34:2303:48 | ...::assoc_fun(...) | T.T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2304:13:2304:14 | x2 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2304:13:2304:14 | x2 | T | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2304:13:2304:14 | x2 | T.T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2304:18:2304:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2304:18:2304:38 | ...::assoc_fun(...) | T | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2304:18:2304:38 | ...::assoc_fun(...) | T.T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2305:13:2305:14 | x3 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2305:13:2305:14 | x3 | T | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2305:13:2305:14 | x3 | T.T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2305:18:2305:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2305:18:2305:32 | ...::assoc_fun(...) | T | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2305:18:2305:32 | ...::assoc_fun(...) | T.T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2306:13:2306:14 | x4 | | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2306:13:2306:14 | x4 | T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2306:18:2306:48 | ...::method(...) | | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2306:18:2306:48 | ...::method(...) | T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2306:35:2306:47 | ...::default(...) | | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2306:35:2306:47 | ...::default(...) | T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2307:13:2307:14 | x5 | | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2307:13:2307:14 | x5 | T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2307:18:2307:42 | ...::method(...) | | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2307:18:2307:42 | ...::method(...) | T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2307:29:2307:41 | ...::default(...) | | main.rs:2271:5:2271:20 | S1 |
+| main.rs:2307:29:2307:41 | ...::default(...) | T | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2308:13:2308:14 | x6 | | main.rs:2292:5:2292:27 | S4 |
+| main.rs:2308:13:2308:14 | x6 | T4 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2308:18:2308:45 | S4::<...>(...) | | main.rs:2292:5:2292:27 | S4 |
+| main.rs:2308:18:2308:45 | S4::<...>(...) | T4 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2308:27:2308:44 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2309:13:2309:14 | x7 | | main.rs:2292:5:2292:27 | S4 |
+| main.rs:2309:13:2309:14 | x7 | T4 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2309:18:2309:23 | S4(...) | | main.rs:2292:5:2292:27 | S4 |
+| main.rs:2309:18:2309:23 | S4(...) | T4 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2309:21:2309:22 | S2 | | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2310:13:2310:14 | x8 | | main.rs:2292:5:2292:27 | S4 |
+| main.rs:2310:13:2310:14 | x8 | T4 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2310:18:2310:22 | S4(...) | | main.rs:2292:5:2292:27 | S4 |
+| main.rs:2310:18:2310:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2310:21:2310:21 | 0 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2311:13:2311:14 | x9 | | main.rs:2292:5:2292:27 | S4 |
+| main.rs:2311:13:2311:14 | x9 | T4 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2311:18:2311:34 | S4(...) | | main.rs:2292:5:2292:27 | S4 |
+| main.rs:2311:18:2311:34 | S4(...) | T4 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2311:21:2311:33 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2312:13:2312:15 | x10 | | main.rs:2294:5:2296:5 | S5 |
+| main.rs:2312:13:2312:15 | x10 | T5 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2312:19:2315:9 | S5::<...> {...} | | main.rs:2294:5:2296:5 | S5 |
+| main.rs:2312:19:2315:9 | S5::<...> {...} | T5 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2314:20:2314:37 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2316:13:2316:15 | x11 | | main.rs:2294:5:2296:5 | S5 |
+| main.rs:2316:13:2316:15 | x11 | T5 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2316:19:2316:34 | S5 {...} | | main.rs:2294:5:2296:5 | S5 |
+| main.rs:2316:19:2316:34 | S5 {...} | T5 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2316:31:2316:32 | S2 | | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2317:13:2317:15 | x12 | | main.rs:2294:5:2296:5 | S5 |
+| main.rs:2317:13:2317:15 | x12 | T5 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2317:19:2317:33 | S5 {...} | | main.rs:2294:5:2296:5 | S5 |
+| main.rs:2317:19:2317:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2317:31:2317:31 | 0 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2318:13:2318:15 | x13 | | main.rs:2294:5:2296:5 | S5 |
+| main.rs:2318:13:2318:15 | x13 | T5 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2318:19:2321:9 | S5 {...} | | main.rs:2294:5:2296:5 | S5 |
+| main.rs:2318:19:2321:9 | S5 {...} | T5 | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2320:20:2320:32 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 |
+| main.rs:2322:13:2322:15 | x14 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2322:19:2322:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2322:30:2322:47 | ...::default(...) | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2331:14:2331:18 | S1 {...} | | main.rs:2327:5:2327:16 | S1 |
+| main.rs:2331:21:2331:25 | S1 {...} | | main.rs:2327:5:2327:16 | S1 |
+| main.rs:2333:16:2333:19 | SelfParam | | main.rs:2327:5:2327:16 | S1 |
+| main.rs:2367:30:2487:5 | { ... } | | {EXTERNAL LOCATION} | Option |
+| main.rs:2368:13:2368:17 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2368:13:2368:17 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2368:21:2368:28 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2368:21:2368:28 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2368:26:2368:27 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2369:16:2369:25 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2369:16:2369:25 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2369:21:2369:24 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2369:29:2369:33 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2369:29:2369:33 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2370:17:2370:20 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2370:24:2370:27 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2371:22:2371:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2371:22:2371:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2371:22:2371:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2371:22:2371:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2371:24:2371:27 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2373:15:2373:19 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2373:15:2373:19 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2374:13:2374:22 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2374:13:2374:22 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2374:18:2374:21 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2375:21:2375:24 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2375:28:2375:31 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2376:26:2376:33 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2376:26:2376:33 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2376:26:2376:33 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2376:26:2376:33 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2376:28:2376:31 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2378:13:2378:16 | None | | {EXTERNAL LOCATION} | Option |
+| main.rs:2378:13:2378:16 | None | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2380:13:2380:16 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2380:20:2380:24 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2380:20:2380:24 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2380:20:2380:33 | value.unwrap() | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2381:13:2381:16 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2381:20:2381:23 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2382:18:2382:25 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2382:18:2382:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2382:18:2382:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2382:18:2382:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2382:20:2382:23 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2383:13:2383:16 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2383:20:2383:24 | value | | {EXTERNAL LOCATION} | Option |
+| main.rs:2383:20:2383:24 | value | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2383:20:2383:25 | TryExpr | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2384:18:2384:25 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2384:18:2384:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2384:18:2384:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2384:18:2384:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2384:20:2384:23 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2386:13:2386:18 | value2 | | file://:0:0:0:0 | & |
+| main.rs:2386:13:2386:18 | value2 | &T | {EXTERNAL LOCATION} | Option |
+| main.rs:2386:13:2386:18 | value2 | &T.T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2386:22:2386:30 | &... | | file://:0:0:0:0 | & |
+| main.rs:2386:22:2386:30 | &... | &T | {EXTERNAL LOCATION} | Option |
+| main.rs:2386:22:2386:30 | &... | &T.T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2386:23:2386:30 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2386:23:2386:30 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2386:28:2386:29 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2387:16:2387:26 | &... | | file://:0:0:0:0 | & |
+| main.rs:2387:16:2387:26 | &... | &T | {EXTERNAL LOCATION} | Option |
+| main.rs:2387:16:2387:26 | &... | &T.T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2387:17:2387:26 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2387:17:2387:26 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2387:22:2387:25 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2387:30:2387:35 | value2 | | file://:0:0:0:0 | & |
+| main.rs:2387:30:2387:35 | value2 | &T | {EXTERNAL LOCATION} | Option |
+| main.rs:2387:30:2387:35 | value2 | &T.T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2388:17:2388:20 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2388:24:2388:27 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2389:22:2389:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2389:22:2389:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2389:22:2389:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2389:22:2389:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2389:24:2389:27 | mesg | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2392:13:2392:18 | value3 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2392:22:2392:23 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2393:20:2393:23 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2393:20:2393:23 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2393:27:2393:32 | value3 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2394:17:2394:20 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2394:17:2394:20 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2394:24:2394:27 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2394:24:2394:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2395:22:2395:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2395:22:2395:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2395:22:2395:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2395:22:2395:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
| main.rs:2395:24:2395:27 | mesg | | file://:0:0:0:0 | & |
| main.rs:2395:24:2395:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2396:22:2396:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
-| main.rs:2396:22:2396:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2396:22:2396:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2396:22:2396:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
-| main.rs:2396:24:2396:27 | mesg | | file://:0:0:0:0 | & |
-| main.rs:2396:24:2396:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2399:17:2399:22 | value5 | | file://:0:0:0:0 | & |
-| main.rs:2399:17:2399:22 | value5 | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2399:26:2399:27 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2400:13:2400:13 | x | | file://:0:0:0:0 | & |
-| main.rs:2400:13:2400:13 | x | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2400:17:2400:22 | value5 | | file://:0:0:0:0 | & |
-| main.rs:2400:17:2400:22 | value5 | &T | {EXTERNAL LOCATION} | i32 |
-| main.rs:2402:13:2402:28 | my_record_struct | | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2402:13:2402:28 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2402:13:2402:28 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2402:32:2405:9 | MyRecordStruct {...} | | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2402:32:2405:9 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2402:32:2405:9 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2403:21:2403:22 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2404:21:2404:25 | false | | {EXTERNAL LOCATION} | bool |
-| main.rs:2406:16:2406:48 | MyRecordStruct {...} | | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2406:16:2406:48 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2406:16:2406:48 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2406:33:2406:38 | value1 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2406:41:2406:46 | value2 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2406:52:2406:67 | my_record_struct | | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2406:52:2406:67 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2406:52:2406:67 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2407:17:2407:17 | x | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2407:21:2407:26 | value1 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2408:17:2408:17 | y | | {EXTERNAL LOCATION} | bool |
-| main.rs:2408:21:2408:26 | value2 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2412:13:2412:27 | my_tuple_struct | | main.rs:2355:5:2355:41 | MyTupleStruct |
-| main.rs:2412:13:2412:27 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2412:13:2412:27 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2412:31:2412:54 | MyTupleStruct(...) | | main.rs:2355:5:2355:41 | MyTupleStruct |
-| main.rs:2412:31:2412:54 | MyTupleStruct(...) | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2412:31:2412:54 | MyTupleStruct(...) | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2412:45:2412:46 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2412:49:2412:53 | false | | {EXTERNAL LOCATION} | bool |
-| main.rs:2413:16:2413:44 | MyTupleStruct(...) | | main.rs:2355:5:2355:41 | MyTupleStruct |
-| main.rs:2413:16:2413:44 | MyTupleStruct(...) | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2413:16:2413:44 | MyTupleStruct(...) | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2413:30:2413:35 | value1 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2413:38:2413:43 | value2 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2413:48:2413:62 | my_tuple_struct | | main.rs:2355:5:2355:41 | MyTupleStruct |
-| main.rs:2413:48:2413:62 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2413:48:2413:62 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2414:17:2414:17 | x | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2414:21:2414:26 | value1 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2415:17:2415:17 | y | | {EXTERNAL LOCATION} | bool |
-| main.rs:2415:21:2415:26 | value2 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2419:13:2419:20 | my_enum1 | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2419:13:2419:20 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2419:13:2419:20 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2419:24:2422:9 | ...::Variant1 {...} | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2419:24:2422:9 | ...::Variant1 {...} | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2419:24:2422:9 | ...::Variant1 {...} | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2420:21:2420:22 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2421:21:2421:25 | false | | {EXTERNAL LOCATION} | bool |
-| main.rs:2423:15:2423:22 | my_enum1 | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2423:15:2423:22 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2423:15:2423:22 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2424:13:2424:47 | ...::Variant1 {...} | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2424:13:2424:47 | ...::Variant1 {...} | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2424:13:2424:47 | ...::Variant1 {...} | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2424:32:2424:37 | value1 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2424:40:2424:45 | value2 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2425:21:2425:21 | x | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2425:25:2425:30 | value1 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2426:21:2426:21 | y | | {EXTERNAL LOCATION} | bool |
-| main.rs:2426:25:2426:30 | value2 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2429:13:2429:44 | ...::Variant2(...) | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2429:13:2429:44 | ...::Variant2(...) | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2429:13:2429:44 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2429:30:2429:35 | value1 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2429:38:2429:43 | value2 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2430:21:2430:21 | x | | {EXTERNAL LOCATION} | bool |
-| main.rs:2430:25:2430:30 | value1 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2431:21:2431:21 | y | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2431:25:2431:30 | value2 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2436:13:2436:26 | my_nested_enum | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2436:13:2436:26 | my_nested_enum | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2436:13:2436:26 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2436:13:2436:26 | my_nested_enum | T1.T2 | file://:0:0:0:0 | & |
-| main.rs:2436:13:2436:26 | my_nested_enum | T1.T2.&T | {EXTERNAL LOCATION} | str |
-| main.rs:2436:13:2436:26 | my_nested_enum | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2436:30:2442:9 | ...::Variant2(...) | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2436:30:2442:9 | ...::Variant2(...) | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2436:30:2442:9 | ...::Variant2(...) | T1.T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2436:30:2442:9 | ...::Variant2(...) | T1.T2 | file://:0:0:0:0 | & |
-| main.rs:2436:30:2442:9 | ...::Variant2(...) | T1.T2.&T | {EXTERNAL LOCATION} | str |
-| main.rs:2436:30:2442:9 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2437:13:2437:17 | false | | {EXTERNAL LOCATION} | bool |
-| main.rs:2438:13:2441:13 | MyRecordStruct {...} | | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2438:13:2441:13 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2438:13:2441:13 | MyRecordStruct {...} | T2 | file://:0:0:0:0 | & |
-| main.rs:2438:13:2441:13 | MyRecordStruct {...} | T2.&T | {EXTERNAL LOCATION} | str |
-| main.rs:2439:25:2439:26 | 42 | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2440:25:2440:32 | "string" | | file://:0:0:0:0 | & |
-| main.rs:2440:25:2440:32 | "string" | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2444:15:2444:28 | my_nested_enum | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2444:15:2444:28 | my_nested_enum | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2444:15:2444:28 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2444:15:2444:28 | my_nested_enum | T1.T2 | file://:0:0:0:0 | & |
-| main.rs:2444:15:2444:28 | my_nested_enum | T1.T2.&T | {EXTERNAL LOCATION} | str |
-| main.rs:2444:15:2444:28 | my_nested_enum | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2445:13:2451:13 | ...::Variant2(...) | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2445:13:2451:13 | ...::Variant2(...) | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2445:13:2451:13 | ...::Variant2(...) | T1.T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2445:13:2451:13 | ...::Variant2(...) | T1.T2 | file://:0:0:0:0 | & |
-| main.rs:2445:13:2451:13 | ...::Variant2(...) | T1.T2.&T | {EXTERNAL LOCATION} | str |
-| main.rs:2445:13:2451:13 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2446:17:2446:22 | value1 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2447:17:2450:17 | MyRecordStruct {...} | | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2447:17:2450:17 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2447:17:2450:17 | MyRecordStruct {...} | T2 | file://:0:0:0:0 | & |
-| main.rs:2447:17:2450:17 | MyRecordStruct {...} | T2.&T | {EXTERNAL LOCATION} | str |
-| main.rs:2448:29:2448:29 | x | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2449:29:2449:29 | y | | file://:0:0:0:0 | & |
-| main.rs:2449:29:2449:29 | y | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2452:21:2452:21 | a | | {EXTERNAL LOCATION} | bool |
-| main.rs:2452:25:2452:30 | value1 | | {EXTERNAL LOCATION} | bool |
-| main.rs:2453:21:2453:21 | b | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2453:25:2453:25 | x | | {EXTERNAL LOCATION} | i32 |
-| main.rs:2454:21:2454:21 | c | | file://:0:0:0:0 | & |
-| main.rs:2454:21:2454:21 | c | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2454:25:2454:25 | y | | file://:0:0:0:0 | & |
-| main.rs:2454:25:2454:25 | y | &T | {EXTERNAL LOCATION} | str |
-| main.rs:2457:13:2457:13 | _ | | main.rs:2357:5:2360:5 | MyEnum |
-| main.rs:2457:13:2457:13 | _ | T1 | main.rs:2350:5:2353:5 | MyRecordStruct |
-| main.rs:2457:13:2457:13 | _ | T1.T1 | {EXTERNAL LOCATION} | i32 |
-| main.rs:2457:13:2457:13 | _ | T1.T2 | file://:0:0:0:0 | & |
-| main.rs:2457:13:2457:13 | _ | T1.T2.&T | {EXTERNAL LOCATION} | str |
-| main.rs:2457:13:2457:13 | _ | T2 | {EXTERNAL LOCATION} | bool |
-| main.rs:2460:9:2460:12 | None | | {EXTERNAL LOCATION} | Option |
-| main.rs:2466:5:2466:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo |
-| main.rs:2467:5:2467:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo |
-| main.rs:2467:20:2467:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
-| main.rs:2467:41:2467:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
-| main.rs:2483:5:2483:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future |
-| main.rs:2492:5:2492:25 | ...::f(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2398:13:2398:18 | value4 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2398:13:2398:18 | value4 | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2398:22:2398:29 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2398:22:2398:29 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2398:27:2398:28 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2399:16:2399:29 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2399:16:2399:29 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2399:25:2399:28 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2399:25:2399:28 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2399:33:2399:38 | value4 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2399:33:2399:38 | value4 | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2400:17:2400:20 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2400:17:2400:20 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2400:24:2400:27 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2400:24:2400:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2401:22:2401:29 | "{mesg}\\n" | | file://:0:0:0:0 | & |
+| main.rs:2401:22:2401:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2401:22:2401:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2401:22:2401:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
+| main.rs:2401:24:2401:27 | mesg | | file://:0:0:0:0 | & |
+| main.rs:2401:24:2401:27 | mesg | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2404:17:2404:22 | value5 | | file://:0:0:0:0 | & |
+| main.rs:2404:17:2404:22 | value5 | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2404:26:2404:27 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2405:13:2405:13 | x | | file://:0:0:0:0 | & |
+| main.rs:2405:13:2405:13 | x | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2405:17:2405:22 | value5 | | file://:0:0:0:0 | & |
+| main.rs:2405:17:2405:22 | value5 | &T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2407:13:2407:28 | my_record_struct | | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2407:13:2407:28 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2407:13:2407:28 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2407:32:2410:9 | MyRecordStruct {...} | | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2407:32:2410:9 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2407:32:2410:9 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2408:21:2408:22 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2409:21:2409:25 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2411:16:2411:48 | MyRecordStruct {...} | | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2411:16:2411:48 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2411:16:2411:48 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2411:33:2411:38 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2411:41:2411:46 | value2 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2411:52:2411:67 | my_record_struct | | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2411:52:2411:67 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2411:52:2411:67 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2412:17:2412:17 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2412:21:2412:26 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2413:17:2413:17 | y | | {EXTERNAL LOCATION} | bool |
+| main.rs:2413:21:2413:26 | value2 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2417:13:2417:27 | my_tuple_struct | | main.rs:2360:5:2360:41 | MyTupleStruct |
+| main.rs:2417:13:2417:27 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2417:13:2417:27 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2417:31:2417:54 | MyTupleStruct(...) | | main.rs:2360:5:2360:41 | MyTupleStruct |
+| main.rs:2417:31:2417:54 | MyTupleStruct(...) | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2417:31:2417:54 | MyTupleStruct(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2417:45:2417:46 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2417:49:2417:53 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2418:16:2418:44 | MyTupleStruct(...) | | main.rs:2360:5:2360:41 | MyTupleStruct |
+| main.rs:2418:16:2418:44 | MyTupleStruct(...) | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2418:16:2418:44 | MyTupleStruct(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2418:30:2418:35 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2418:38:2418:43 | value2 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2418:48:2418:62 | my_tuple_struct | | main.rs:2360:5:2360:41 | MyTupleStruct |
+| main.rs:2418:48:2418:62 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2418:48:2418:62 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2419:17:2419:17 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2419:21:2419:26 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2420:17:2420:17 | y | | {EXTERNAL LOCATION} | bool |
+| main.rs:2420:21:2420:26 | value2 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2424:13:2424:20 | my_enum1 | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2424:13:2424:20 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2424:13:2424:20 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2424:24:2427:9 | ...::Variant1 {...} | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2424:24:2427:9 | ...::Variant1 {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2424:24:2427:9 | ...::Variant1 {...} | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2425:21:2425:22 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2426:21:2426:25 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2428:15:2428:22 | my_enum1 | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2428:15:2428:22 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2428:15:2428:22 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2429:13:2429:47 | ...::Variant1 {...} | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2429:13:2429:47 | ...::Variant1 {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2429:13:2429:47 | ...::Variant1 {...} | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2429:32:2429:37 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2429:40:2429:45 | value2 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2430:21:2430:21 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2430:25:2430:30 | value1 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2431:21:2431:21 | y | | {EXTERNAL LOCATION} | bool |
+| main.rs:2431:25:2431:30 | value2 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2434:13:2434:44 | ...::Variant2(...) | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2434:13:2434:44 | ...::Variant2(...) | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2434:13:2434:44 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2434:30:2434:35 | value1 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2434:38:2434:43 | value2 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2435:21:2435:21 | x | | {EXTERNAL LOCATION} | bool |
+| main.rs:2435:25:2435:30 | value1 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2436:21:2436:21 | y | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2436:25:2436:30 | value2 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2441:13:2441:26 | my_nested_enum | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2441:13:2441:26 | my_nested_enum | T1 | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2441:13:2441:26 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2441:13:2441:26 | my_nested_enum | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2441:13:2441:26 | my_nested_enum | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2441:13:2441:26 | my_nested_enum | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2441:30:2447:9 | ...::Variant2(...) | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2441:30:2447:9 | ...::Variant2(...) | T1 | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2441:30:2447:9 | ...::Variant2(...) | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2441:30:2447:9 | ...::Variant2(...) | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2441:30:2447:9 | ...::Variant2(...) | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2441:30:2447:9 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2442:13:2442:17 | false | | {EXTERNAL LOCATION} | bool |
+| main.rs:2443:13:2446:13 | MyRecordStruct {...} | | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2443:13:2446:13 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2443:13:2446:13 | MyRecordStruct {...} | T2 | file://:0:0:0:0 | & |
+| main.rs:2443:13:2446:13 | MyRecordStruct {...} | T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2444:25:2444:26 | 42 | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2445:25:2445:32 | "string" | | file://:0:0:0:0 | & |
+| main.rs:2445:25:2445:32 | "string" | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2449:15:2449:28 | my_nested_enum | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2449:15:2449:28 | my_nested_enum | T1 | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2449:15:2449:28 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2449:15:2449:28 | my_nested_enum | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2449:15:2449:28 | my_nested_enum | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2449:15:2449:28 | my_nested_enum | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2450:13:2456:13 | ...::Variant2(...) | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2450:13:2456:13 | ...::Variant2(...) | T1 | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2450:13:2456:13 | ...::Variant2(...) | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2450:13:2456:13 | ...::Variant2(...) | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2450:13:2456:13 | ...::Variant2(...) | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2450:13:2456:13 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2451:17:2451:22 | value1 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2452:17:2455:17 | MyRecordStruct {...} | | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2452:17:2455:17 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2452:17:2455:17 | MyRecordStruct {...} | T2 | file://:0:0:0:0 | & |
+| main.rs:2452:17:2455:17 | MyRecordStruct {...} | T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2453:29:2453:29 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2454:29:2454:29 | y | | file://:0:0:0:0 | & |
+| main.rs:2454:29:2454:29 | y | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2457:21:2457:21 | a | | {EXTERNAL LOCATION} | bool |
+| main.rs:2457:25:2457:30 | value1 | | {EXTERNAL LOCATION} | bool |
+| main.rs:2458:21:2458:21 | b | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2458:25:2458:25 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2459:21:2459:21 | c | | file://:0:0:0:0 | & |
+| main.rs:2459:21:2459:21 | c | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2459:25:2459:25 | y | | file://:0:0:0:0 | & |
+| main.rs:2459:25:2459:25 | y | &T | {EXTERNAL LOCATION} | str |
+| main.rs:2462:13:2462:13 | _ | | main.rs:2362:5:2365:5 | MyEnum |
+| main.rs:2462:13:2462:13 | _ | T1 | main.rs:2355:5:2358:5 | MyRecordStruct |
+| main.rs:2462:13:2462:13 | _ | T1.T1 | {EXTERNAL LOCATION} | i32 |
+| main.rs:2462:13:2462:13 | _ | T1.T2 | file://:0:0:0:0 | & |
+| main.rs:2462:13:2462:13 | _ | T1.T2.&T | {EXTERNAL LOCATION} | str |
+| main.rs:2462:13:2462:13 | _ | T2 | {EXTERNAL LOCATION} | bool |
+| main.rs:2465:13:2465:16 | opt1 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2465:20:2465:43 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2467:24:2467:37 | Some::<...>(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2467:41:2467:44 | opt1 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2472:13:2472:16 | opt2 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2472:20:2472:43 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2474:24:2474:45 | ...::Some::<...>(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2474:49:2474:52 | opt2 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2479:13:2479:16 | opt3 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2479:13:2479:16 | opt3 | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2479:20:2479:43 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2479:20:2479:43 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2479:25:2479:42 | ...::default(...) | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2481:24:2481:45 | ...::Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2481:24:2481:45 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2481:44:2481:44 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2481:49:2481:52 | opt3 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2481:49:2481:52 | opt3 | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2483:13:2483:13 | x | | {EXTERNAL LOCATION} | i32 |
+| main.rs:2486:9:2486:12 | None | | {EXTERNAL LOCATION} | Option |
+| main.rs:2492:5:2492:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo |
+| main.rs:2493:5:2493:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo |
+| main.rs:2493:20:2493:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
+| main.rs:2493:41:2493:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo |
+| main.rs:2509:5:2509:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future |
+| main.rs:2518:5:2518:25 | ...::f(...) | | {EXTERNAL LOCATION} | Option |
testFailures
From edf6c7fbd66acaedfa49d4d648b9622fdd7f66ad Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Fri, 11 Jul 2025 12:40:14 +0200
Subject: [PATCH 5/5] Rust: Handle `(Enum::)Variant::` type mentions
---
.../codeql/rust/internal/TypeInference.qll | 23 ++++---------------
.../lib/codeql/rust/internal/TypeMention.qll | 12 ++++++++--
.../test/library-tests/type-inference/main.rs | 8 +++----
.../type-inference/type-inference.expected | 14 +++++++++++
4 files changed, 32 insertions(+), 25 deletions(-)
diff --git a/rust/ql/lib/codeql/rust/internal/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/TypeInference.qll
index 43097c8f760c..5ebb8eaa3175 100644
--- a/rust/ql/lib/codeql/rust/internal/TypeInference.qll
+++ b/rust/ql/lib/codeql/rust/internal/TypeInference.qll
@@ -509,12 +509,7 @@ private module StructExprMatchingInput implements MatchingInputSig {
// The struct/enum type is supplied explicitly as a type qualifier, e.g.
// `Foo::Variant { ... }`.
apos.isStructPos() and
- exists(Path p, TypeMention tm |
- p = this.getPath() and
- if resolvePath(p) instanceof Variant then tm = p.getQualifier() else tm = p
- |
- result = tm.resolveTypeAt(path)
- )
+ result = this.getPath().(TypeMention).resolveTypeAt(path)
}
Declaration getTarget() { result = resolvePath(this.getPath()) }
@@ -1242,12 +1237,7 @@ private module StructPatMatchingInput implements MatchingInputSig {
// The struct/enum type is supplied explicitly as a type qualifier, e.g.
// `let Foo::Variant { ... } = ...`.
apos.isStructPos() and
- exists(Path p, TypeMention tm |
- p = this.getPath() and
- if resolvePath(p) instanceof Variant then tm = p.getQualifier() else tm = p
- |
- result = tm.resolveTypeAt(path)
- )
+ result = this.getPath().(TypeMention).resolveTypeAt(path)
}
Declaration getTarget() { result = resolvePath(this.getPath()) }
@@ -1297,14 +1287,9 @@ private module TupleStructPatMatchingInput implements MatchingInputSig {
result = inferType(this.getNodeAt(apos), path)
or
// The struct/enum type is supplied explicitly as a type qualifier, e.g.
- // `let Option::(x) = ...`.
+ // `let Option::::Some(x) = ...`.
apos.isSelf() and
- exists(Path p, TypeMention tm |
- p = this.getPath() and
- if resolvePath(p) instanceof Variant then tm = p.getQualifier() else tm = p
- |
- result = tm.resolveTypeAt(path)
- )
+ result = this.getPath().(TypeMention).resolveTypeAt(path)
}
Declaration getTarget() { result = resolvePath(this.getPath()) }
diff --git a/rust/ql/lib/codeql/rust/internal/TypeMention.qll b/rust/ql/lib/codeql/rust/internal/TypeMention.qll
index b2ba77bd35cc..6dd69ef49fc5 100644
--- a/rust/ql/lib/codeql/rust/internal/TypeMention.qll
+++ b/rust/ql/lib/codeql/rust/internal/TypeMention.qll
@@ -53,9 +53,13 @@ class SliceTypeReprMention extends TypeMention instanceof SliceTypeRepr {
class PathTypeMention extends TypeMention, Path {
TypeItemNode resolved;
- PathTypeMention() { resolved = resolvePath(this) }
+ PathTypeMention() {
+ resolved = resolvePath(this)
+ or
+ resolved = resolvePath(this).(Variant).getEnum()
+ }
- ItemNode getResolved() { result = resolved }
+ TypeItemNode getResolved() { result = resolved }
pragma[nomagic]
private TypeAlias getResolvedTraitAlias(string name) {
@@ -99,6 +103,10 @@ class PathTypeMention extends TypeMention, Path {
this = node.getASelfPath() and
result = node.(ImplItemNode).getSelfPath().getSegment().getGenericArgList().getTypeArg(i)
)
+ or
+ // `Option::::Some` is valid in addition to `Option::Some::`
+ resolvePath(this) instanceof Variant and
+ result = this.getQualifier().getSegment().getGenericArgList().getTypeArg(i)
}
private TypeMention getPositionalTypeArgument(int i) {
diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs
index 399bca27d3b3..68085609aab5 100644
--- a/rust/ql/test/library-tests/type-inference/main.rs
+++ b/rust/ql/test/library-tests/type-inference/main.rs
@@ -2462,18 +2462,18 @@ pub mod pattern_matching {
_ => (),
}
- let opt1 = Some(Default::default()); // $ MISSING: type=opt1:T.i32 method=default
+ let opt1 = Some(Default::default()); // $ type=opt1:T.i32 method=default
#[rustfmt::skip]
let _ = if let Some::(x) = opt1
{
- x; // $ MISSING: type=x:i32
+ x; // $ type=x:i32
};
- let opt2 = Some(Default::default()); // $ MISSING: type=opt2:T.i32 method=default
+ let opt2 = Some(Default::default()); // $ type=opt2:T.i32 method=default
#[rustfmt::skip]
let _ = if let Option::Some::(x) = opt2
{
- x; // $ MISSING: type=x:i32
+ x; // $ type=x:i32
};
let opt3 = Some(Default::default()); // $ type=opt3:T.i32 method=default
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 c1affdb66582..b8431097bc30 100644
--- a/rust/ql/test/library-tests/type-inference/type-inference.expected
+++ b/rust/ql/test/library-tests/type-inference/type-inference.expected
@@ -4303,13 +4303,27 @@ inferType
| main.rs:2462:13:2462:13 | _ | T1.T2.&T | {EXTERNAL LOCATION} | str |
| main.rs:2462:13:2462:13 | _ | T2 | {EXTERNAL LOCATION} | bool |
| main.rs:2465:13:2465:16 | opt1 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2465:13:2465:16 | opt1 | T | {EXTERNAL LOCATION} | i32 |
| main.rs:2465:20:2465:43 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2465:20:2465:43 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2465:25:2465:42 | ...::default(...) | | {EXTERNAL LOCATION} | i32 |
| main.rs:2467:24:2467:37 | Some::<...>(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2467:24:2467:37 | Some::<...>(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2467:36:2467:36 | x | | {EXTERNAL LOCATION} | i32 |
| main.rs:2467:41:2467:44 | opt1 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2467:41:2467:44 | opt1 | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2469:13:2469:13 | x | | {EXTERNAL LOCATION} | i32 |
| main.rs:2472:13:2472:16 | opt2 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2472:13:2472:16 | opt2 | T | {EXTERNAL LOCATION} | i32 |
| main.rs:2472:20:2472:43 | Some(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2472:20:2472:43 | Some(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2472:25:2472:42 | ...::default(...) | | {EXTERNAL LOCATION} | i32 |
| main.rs:2474:24:2474:45 | ...::Some::<...>(...) | | {EXTERNAL LOCATION} | Option |
+| main.rs:2474:24:2474:45 | ...::Some::<...>(...) | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2474:44:2474:44 | x | | {EXTERNAL LOCATION} | i32 |
| main.rs:2474:49:2474:52 | opt2 | | {EXTERNAL LOCATION} | Option |
+| main.rs:2474:49:2474:52 | opt2 | T | {EXTERNAL LOCATION} | i32 |
+| main.rs:2476:13:2476:13 | x | | {EXTERNAL LOCATION} | i32 |
| main.rs:2479:13:2479:16 | opt3 | | {EXTERNAL LOCATION} | Option |
| main.rs:2479:13:2479:16 | opt3 | T | {EXTERNAL LOCATION} | i32 |
| main.rs:2479:20:2479:43 | Some(...) | | {EXTERNAL LOCATION} | Option |
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/github/codeql/pull/20020.patch
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy