From bf8b75d22166cc44c5b1a14cc039fe68985e3e1c Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 18 Aug 2025 11:37:38 +0200 Subject: [PATCH 1/3] Rust: Add type inference tests --- .../PathResolutionConsistency.expected | 16 +- .../type-inference/dereference.rs | 90 + .../test/library-tests/type-inference/main.rs | 39 +- .../type-inference/type-inference.expected | 3632 +++++++++-------- 4 files changed, 1999 insertions(+), 1778 deletions(-) diff --git a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected index d2aa2f396c73..ffb9b672487c 100644 --- a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected @@ -1,8 +1,10 @@ multipleCallTargets -| dereference.rs:61:15:61:24 | e1.deref() | -| main.rs:2357:13:2357:31 | ...::from(...) | -| main.rs:2358:13:2358:31 | ...::from(...) | -| main.rs:2359:13:2359:31 | ...::from(...) | -| main.rs:2365:13:2365:31 | ...::from(...) | -| main.rs:2366:13:2366:31 | ...::from(...) | -| main.rs:2367:13:2367:31 | ...::from(...) | +| dereference.rs:69:15:69:24 | e1.deref() | +| dereference.rs:186:17:186:25 | S.bar(...) | +| dereference.rs:187:17:187:29 | S.bar(...) | +| main.rs:2372:13:2372:31 | ...::from(...) | +| main.rs:2373:13:2373:31 | ...::from(...) | +| main.rs:2374:13:2374:31 | ...::from(...) | +| main.rs:2380:13:2380:31 | ...::from(...) | +| main.rs:2381:13:2381:31 | ...::from(...) | +| main.rs:2382:13:2382:31 | ...::from(...) | diff --git a/rust/ql/test/library-tests/type-inference/dereference.rs b/rust/ql/test/library-tests/type-inference/dereference.rs index f4d9d68a0995..6e57fc20c19a 100644 --- a/rust/ql/test/library-tests/type-inference/dereference.rs +++ b/rust/ql/test/library-tests/type-inference/dereference.rs @@ -27,6 +27,14 @@ impl Deref for MySmartPointer { } } +struct S(T); + +impl S { + fn foo(&self) -> &T { + &self.0 // $ fieldof=S + } +} + fn explicit_monomorphic_dereference() { // Dereference with method call let a1 = MyIntPointer { value: 34i64 }; @@ -91,6 +99,9 @@ fn implicit_dereference() { // Call method on implicitly dereferenced value let x = MySmartPointer { value: 34i64 }; let _y = x.is_positive(); // $ MISSING: target=is_positive type=_y:bool + + let z = MySmartPointer { value: S(0i64) }; + let z_ = z.foo(); // $ MISSING: target=foo type=z_:&T.i64 } mod implicit_deref_coercion_cycle { @@ -128,6 +139,83 @@ mod implicit_deref_coercion_cycle { } } +mod ref_vs_mut_ref { + trait MyTrait1 { + fn foo(self) -> T; + } + + struct S; + + impl MyTrait1 for &S { + // MyTrait1::foo1 + fn foo(self) -> S { + S + } + } + + impl MyTrait1 for &mut S { + // MyTrait1::foo2 + fn foo(self) -> i64 { + 42 + } + } + + trait MyTrait2 { + fn bar(self, arg: T1) -> T2; + } + + impl MyTrait2<&S, S> for S { + // MyTrait2::bar1 + fn bar(self, arg: &S) -> S { + S + } + } + + impl MyTrait2<&mut S, i64> for S { + // MyTrait2::bar2 + fn bar(self, arg: &mut S) -> i64 { + 42 + } + } + + pub fn test() { + let x = (&S).foo(); // $ MISSING: target=MyTrait1::foo1 type=x:S + let y = S.foo(); // $ MISSING: target=MyTrait1::foo1 type=y:S + let z = (&mut S).foo(); // $ MISSING: target=MyTrait1::foo2 type=z:i64 + + let x = S.bar(&S); // $ target=MyTrait2::bar1 type=x:S $ SPURIOUS: target=MyTrait2::bar2 + let y = S.bar(&mut S); // $ target=MyTrait2::bar2 type=y:i64 $ SPURIOUS: target=MyTrait2::bar1 + } +} + +// from https://doc.rust-lang.org/reference/expressions/method-call-expr.html#r-expr.method.candidate-search +mod rust_reference_example { + struct Foo {} + + trait Bar { + fn bar(&self); + } + + impl Foo { + // bar1 + fn bar(&mut self) { + println!("In struct impl!") + } + } + + impl Bar for Foo { + // bar2 + fn bar(&self) { + println!("In trait impl!") + } + } + + pub fn main() { + let mut f = Foo {}; + f.bar(); // $ SPURIOUS: target=bar1 $ MISSING: target=bar2 + } +} + pub fn test() { explicit_monomorphic_dereference(); // $ target=explicit_monomorphic_dereference explicit_polymorphic_dereference(); // $ target=explicit_polymorphic_dereference @@ -135,4 +223,6 @@ pub fn test() { explicit_box_dereference(); // $ target=explicit_box_dereference implicit_dereference(); // $ target=implicit_dereference implicit_deref_coercion_cycle::test(); // $ target=test + ref_vs_mut_ref::test(); // $ target=test + rust_reference_example::main(); // $ target=main } diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index a6395c5af9ff..1a32a7c229a2 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -958,19 +958,19 @@ mod generic_enum { } mod method_supertraits { - #[derive(Debug)] + #[derive(Debug, Clone, Copy)] struct MyThing { a: A, } - #[derive(Debug)] + #[derive(Debug, Clone, Copy)] struct MyThing2 { a: A, } - #[derive(Debug)] + #[derive(Debug, Clone, Copy)] struct S1; - #[derive(Debug)] + #[derive(Debug, Clone, Copy)] struct S2; trait MyTrait1 { @@ -978,16 +978,16 @@ mod method_supertraits { fn m1(self) -> Tr1; } - trait MyTrait2: MyTrait1 { + trait MyTrait2: MyTrait1 + Copy { #[rustfmt::skip] - fn m2(self) -> Tr2 + fn m2(&self) -> Tr2 where Self: Sized, { if 3 > 2 { // $ target=gt self.m1() // $ target=MyTrait1::m1 } else { - Self::m1(self) // $ target=MyTrait1::m1 + Self::m1(*self) // $ target=deref target=MyTrait1::m1 } } } @@ -1001,7 +1001,7 @@ mod method_supertraits { if 3 > 2 { // $ target=gt self.m2().a // $ target=m2 $ fieldof=MyThing } else { - Self::m2(self).a // $ target=m2 fieldof=MyThing + Self::m2(&self).a // $ target=m2 fieldof=MyThing } } } @@ -1013,7 +1013,7 @@ mod method_supertraits { } } - impl MyTrait2 for MyThing {} + impl MyTrait2 for MyThing {} impl MyTrait1> for MyThing2 { // MyThing2::m1 @@ -1022,9 +1022,9 @@ mod method_supertraits { } } - impl MyTrait2> for MyThing2 {} + impl MyTrait2> for MyThing2 {} - impl MyTrait3 for MyThing2 {} + impl MyTrait3 for MyThing2 {} fn call_trait_m1>(x: T2) -> T1 { x.m1() // $ target=MyTrait1::m1 @@ -1819,6 +1819,11 @@ mod overloadable_operators { self.x >= other.x && self.y >= other.y // $ fieldof=Vec2 target=ge } } + + fn param_add(a: T, b: T) -> T::Output { + a + b // $ target=add + } + pub fn f() { // Test for all overloadable operators on `i64` @@ -1836,6 +1841,7 @@ mod overloadable_operators { let i64_mul = 17i64 * 18i64; // $ type=i64_mul:i64 target=mul let i64_div = 19i64 / 20i64; // $ type=i64_div:i64 target=div let i64_rem = 21i64 % 22i64; // $ type=i64_rem:i64 target=rem + let i64_param_add = param_add(1i64, 2i64); // $ target=param_add $ MISSING: type=i64_param_add:i64 // Arithmetic assignment operators let mut i64_add_assign = 23i64; @@ -2083,7 +2089,7 @@ mod impl_trait { mod indexers { use std::ops::Index; - #[derive(Debug)] + #[derive(Debug, Copy, Clone)] struct S; impl S { @@ -2120,6 +2126,13 @@ mod indexers { let x = slice[0].foo(); // $ target=foo type=x:S target=index } + fn param_index>(a: T, b: usize) -> T::Output + where + >::Output: Sized + Copy, + { + a[b] // $ target=index + } + pub fn f() { let mut vec = MyVec::new(); // $ type=vec:T.S target=new vec.push(S); // $ target=push @@ -2128,6 +2141,8 @@ mod indexers { let xs: [S; 1] = [S]; let x = xs[0].foo(); // $ target=foo type=x:S target=index + let y = param_index(vec, 0); // $ target=param_index $ MISSING: type=y:S + analyze_slice(&xs); // $ target=analyze_slice } } 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 158af57728ff..f33254c5dba2 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -228,217 +228,307 @@ inferType | dereference.rs:26:10:26:13 | self | &T | dereference.rs:17:1:19:1 | MySmartPointer | | dereference.rs:26:10:26:13 | self | &T.T | dereference.rs:21:6:21:6 | T | | dereference.rs:26:10:26:19 | self.value | | dereference.rs:21:6:21:6 | T | -| dereference.rs:32:9:32:10 | a1 | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:32:14:32:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:32:36:32:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:33:9:33:11 | _b1 | | file://:0:0:0:0 | & | -| dereference.rs:33:9:33:11 | _b1 | &T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:33:15:33:16 | a1 | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:33:15:33:24 | a1.deref() | | file://:0:0:0:0 | & | -| dereference.rs:33:15:33:24 | a1.deref() | &T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:36:9:36:10 | a2 | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:36:14:36:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:36:36:36:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:37:9:37:11 | _b2 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:37:15:37:17 | * ... | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:37:16:37:17 | a2 | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:40:9:40:10 | a3 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:33:12:33:16 | SelfParam | | file://:0:0:0:0 | & | +| dereference.rs:33:12:33:16 | SelfParam | &T | dereference.rs:30:1:30:15 | S | +| dereference.rs:33:12:33:16 | SelfParam | &T.T | dereference.rs:32:6:32:6 | T | +| dereference.rs:33:25:35:5 | { ... } | | file://:0:0:0:0 | & | +| dereference.rs:33:25:35:5 | { ... } | &T | dereference.rs:32:6:32:6 | T | +| dereference.rs:34:9:34:15 | &... | | file://:0:0:0:0 | & | +| dereference.rs:34:9:34:15 | &... | &T | dereference.rs:32:6:32:6 | T | +| dereference.rs:34:10:34:13 | self | | file://:0:0:0:0 | & | +| dereference.rs:34:10:34:13 | self | &T | dereference.rs:30:1:30:15 | S | +| dereference.rs:34:10:34:13 | self | &T.T | dereference.rs:32:6:32:6 | T | +| dereference.rs:34:10:34:15 | self.0 | | dereference.rs:32:6:32:6 | T | +| dereference.rs:40:9:40:10 | a1 | | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:40:14:40:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:40:36:40:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:41:9:41:11 | _b3 | | {EXTERNAL LOCATION} | bool | -| dereference.rs:41:15:41:19 | (...) | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:41:15:41:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | -| dereference.rs:41:16:41:18 | * ... | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:41:17:41:18 | a3 | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:46:9:46:10 | c1 | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:46:9:46:10 | c1 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:46:14:46:42 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:46:14:46:42 | MySmartPointer {...} | T | {EXTERNAL LOCATION} | char | -| dereference.rs:46:38:46:40 | 'a' | | {EXTERNAL LOCATION} | char | -| dereference.rs:47:9:47:11 | _d1 | | file://:0:0:0:0 | & | -| dereference.rs:47:9:47:11 | _d1 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:47:15:47:16 | c1 | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:47:15:47:16 | c1 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:47:15:47:24 | c1.deref() | | file://:0:0:0:0 | & | -| dereference.rs:47:15:47:24 | c1.deref() | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:50:9:50:10 | c2 | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:50:9:50:10 | c2 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:50:14:50:42 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:50:14:50:42 | MySmartPointer {...} | T | {EXTERNAL LOCATION} | char | -| dereference.rs:50:38:50:40 | 'a' | | {EXTERNAL LOCATION} | char | -| dereference.rs:51:9:51:11 | _d2 | | {EXTERNAL LOCATION} | char | -| dereference.rs:51:15:51:17 | * ... | | {EXTERNAL LOCATION} | char | -| dereference.rs:51:16:51:17 | c2 | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:51:16:51:17 | c2 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:54:9:54:10 | c3 | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:54:9:54:10 | c3 | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:54:14:54:44 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:54:14:54:44 | MySmartPointer {...} | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:54:38:54:42 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:55:9:55:11 | _d3 | | {EXTERNAL LOCATION} | bool | -| dereference.rs:55:15:55:19 | (...) | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:55:15:55:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | -| dereference.rs:55:16:55:18 | * ... | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:55:17:55:18 | c3 | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:55:17:55:18 | c3 | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:60:9:60:10 | e1 | | file://:0:0:0:0 | & | -| dereference.rs:60:9:60:10 | e1 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:60:9:60:10 | e1 | &T | file://:0:0:0:0 | & | -| dereference.rs:60:14:60:17 | &'a' | | file://:0:0:0:0 | & | -| dereference.rs:60:14:60:17 | &'a' | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:60:14:60:17 | &'a' | &T | file://:0:0:0:0 | & | -| dereference.rs:60:15:60:17 | 'a' | | {EXTERNAL LOCATION} | char | -| dereference.rs:61:9:61:11 | _f1 | | file://:0:0:0:0 | & | -| dereference.rs:61:15:61:16 | e1 | | file://:0:0:0:0 | & | -| dereference.rs:61:15:61:16 | e1 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:61:15:61:16 | e1 | &T | file://:0:0:0:0 | & | -| dereference.rs:61:15:61:24 | e1.deref() | | file://:0:0:0:0 | & | -| dereference.rs:64:9:64:10 | e2 | | file://:0:0:0:0 | & | -| dereference.rs:64:9:64:10 | e2 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:64:14:64:17 | &'a' | | file://:0:0:0:0 | & | -| dereference.rs:64:14:64:17 | &'a' | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:64:15:64:17 | 'a' | | {EXTERNAL LOCATION} | char | -| dereference.rs:65:9:65:11 | _f2 | | {EXTERNAL LOCATION} | char | -| dereference.rs:65:15:65:17 | * ... | | {EXTERNAL LOCATION} | char | -| dereference.rs:65:16:65:17 | e2 | | file://:0:0:0:0 | & | -| dereference.rs:65:16:65:17 | e2 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:68:9:68:10 | e3 | | file://:0:0:0:0 | & | -| dereference.rs:68:9:68:10 | e3 | &T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:68:14:68:19 | &34i64 | | file://:0:0:0:0 | & | -| dereference.rs:68:14:68:19 | &34i64 | &T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:68:15:68:19 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:69:9:69:11 | _f3 | | {EXTERNAL LOCATION} | bool | -| dereference.rs:69:15:69:19 | (...) | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:69:15:69:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | -| dereference.rs:69:16:69:18 | * ... | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:69:17:69:18 | e3 | | file://:0:0:0:0 | & | -| dereference.rs:69:17:69:18 | e3 | &T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:74:9:74:10 | g1 | | {EXTERNAL LOCATION} | Box | -| dereference.rs:74:9:74:10 | g1 | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:74:9:74:10 | g1 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:74:25:74:37 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| dereference.rs:74:25:74:37 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:74:25:74:37 | ...::new(...) | T | {EXTERNAL LOCATION} | char | -| dereference.rs:74:34:74:36 | 'a' | | {EXTERNAL LOCATION} | char | -| dereference.rs:75:9:75:11 | _h1 | | file://:0:0:0:0 | & | -| dereference.rs:75:9:75:11 | _h1 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:75:15:75:16 | g1 | | {EXTERNAL LOCATION} | Box | -| dereference.rs:75:15:75:16 | g1 | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:75:15:75:16 | g1 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:75:15:75:24 | g1.deref() | | file://:0:0:0:0 | & | -| dereference.rs:75:15:75:24 | g1.deref() | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:78:9:78:10 | g2 | | {EXTERNAL LOCATION} | Box | -| dereference.rs:78:9:78:10 | g2 | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:78:9:78:10 | g2 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:78:25:78:37 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| dereference.rs:78:25:78:37 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:78:25:78:37 | ...::new(...) | T | {EXTERNAL LOCATION} | char | -| dereference.rs:78:34:78:36 | 'a' | | {EXTERNAL LOCATION} | char | -| dereference.rs:79:9:79:11 | _h2 | | {EXTERNAL LOCATION} | char | -| dereference.rs:79:15:79:17 | * ... | | {EXTERNAL LOCATION} | char | -| dereference.rs:79:16:79:17 | g2 | | {EXTERNAL LOCATION} | Box | -| dereference.rs:79:16:79:17 | g2 | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:79:16:79:17 | g2 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:82:9:82:10 | g3 | | {EXTERNAL LOCATION} | Box | -| dereference.rs:82:9:82:10 | g3 | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:82:9:82:10 | g3 | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:82:24:82:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| dereference.rs:82:24:82:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:82:24:82:38 | ...::new(...) | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:82:33:82:37 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:83:9:83:11 | _h3 | | {EXTERNAL LOCATION} | bool | -| dereference.rs:83:15:83:19 | (...) | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:83:15:83:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | -| dereference.rs:83:16:83:18 | * ... | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:83:17:83:18 | g3 | | {EXTERNAL LOCATION} | Box | -| dereference.rs:83:17:83:18 | g3 | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:83:17:83:18 | g3 | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:88:9:88:9 | x | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:88:13:88:41 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:88:35:88:39 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:89:14:89:14 | x | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:92:9:92:9 | x | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:92:9:92:9 | x | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:92:13:92:43 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:92:13:92:43 | MySmartPointer {...} | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:92:37:92:41 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:93:14:93:14 | x | | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:93:14:93:14 | x | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:121:17:121:26 | key_to_key | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:121:17:121:26 | key_to_key | K | file://:0:0:0:0 | & | -| dereference.rs:121:17:121:26 | key_to_key | K.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:121:17:121:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:121:17:121:26 | key_to_key | V | file://:0:0:0:0 | & | -| dereference.rs:121:17:121:26 | key_to_key | V.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:121:30:121:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:121:30:121:57 | ...::new(...) | K | file://:0:0:0:0 | & | -| dereference.rs:121:30:121:57 | ...::new(...) | K.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:121:30:121:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:121:30:121:57 | ...::new(...) | V | file://:0:0:0:0 | & | -| dereference.rs:121:30:121:57 | ...::new(...) | V.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:122:17:122:19 | key | | file://:0:0:0:0 | & | -| dereference.rs:122:17:122:19 | key | &T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:122:17:122:19 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:122:17:122:19 | key | &T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:122:23:122:29 | &... | | file://:0:0:0:0 | & | -| dereference.rs:122:23:122:29 | &... | &T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:122:23:122:29 | &... | &T | file://:0:0:0:0 | & | -| dereference.rs:122:23:122:29 | &... | &T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:122:24:122:29 | Key {...} | | dereference.rs:99:5:100:21 | Key | -| dereference.rs:122:24:122:29 | Key {...} | | file://:0:0:0:0 | & | -| dereference.rs:122:24:122:29 | Key {...} | &T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:16:123:28 | Some(...) | | {EXTERNAL LOCATION} | Option | -| dereference.rs:123:16:123:28 | Some(...) | T | file://:0:0:0:0 | & | -| dereference.rs:123:16:123:28 | Some(...) | T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:16:123:28 | Some(...) | T.&T | file://:0:0:0:0 | & | -| dereference.rs:123:16:123:28 | Some(...) | T.&T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:21:123:27 | ref_key | | file://:0:0:0:0 | & | -| dereference.rs:123:21:123:27 | ref_key | &T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:21:123:27 | ref_key | &T | file://:0:0:0:0 | & | -| dereference.rs:123:21:123:27 | ref_key | &T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:32:123:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:123:32:123:41 | key_to_key | K | file://:0:0:0:0 | & | -| dereference.rs:123:32:123:41 | key_to_key | K.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:32:123:41 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:123:32:123:41 | key_to_key | V | file://:0:0:0:0 | & | -| dereference.rs:123:32:123:41 | key_to_key | V.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:32:123:50 | key_to_key.get(...) | | {EXTERNAL LOCATION} | Option | -| dereference.rs:123:32:123:50 | key_to_key.get(...) | T | file://:0:0:0:0 | & | -| dereference.rs:123:32:123:50 | key_to_key.get(...) | T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:32:123:50 | key_to_key.get(...) | T.&T | file://:0:0:0:0 | & | -| dereference.rs:123:32:123:50 | key_to_key.get(...) | T.&T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:47:123:49 | key | | file://:0:0:0:0 | & | -| dereference.rs:123:47:123:49 | key | &T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:123:47:123:49 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:123:47:123:49 | key | &T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:125:13:125:15 | key | | file://:0:0:0:0 | & | -| dereference.rs:125:13:125:15 | key | &T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:125:13:125:15 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:125:13:125:15 | key | &T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:125:13:125:25 | ... = ... | | file://:0:0:0:0 | () | -| dereference.rs:125:19:125:25 | ref_key | | file://:0:0:0:0 | & | -| dereference.rs:125:19:125:25 | ref_key | &T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:125:19:125:25 | ref_key | &T | file://:0:0:0:0 | & | -| dereference.rs:125:19:125:25 | ref_key | &T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:127:9:127:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:127:9:127:18 | key_to_key | K | file://:0:0:0:0 | & | -| dereference.rs:127:9:127:18 | key_to_key | K.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:127:9:127:18 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:127:9:127:18 | key_to_key | V | file://:0:0:0:0 | & | -| dereference.rs:127:9:127:18 | key_to_key | V.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:127:9:127:35 | key_to_key.insert(...) | | {EXTERNAL LOCATION} | Option | -| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T | file://:0:0:0:0 | & | -| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T.&T | file://:0:0:0:0 | & | -| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T.&T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:127:27:127:29 | key | | file://:0:0:0:0 | & | -| dereference.rs:127:27:127:29 | key | &T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:127:27:127:29 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:127:27:127:29 | key | &T.&T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:127:32:127:34 | key | | file://:0:0:0:0 | & | -| dereference.rs:127:32:127:34 | key | &T | dereference.rs:99:5:100:21 | Key | -| dereference.rs:127:32:127:34 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:127:32:127:34 | key | &T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:41:9:41:11 | _b1 | | file://:0:0:0:0 | & | +| dereference.rs:41:9:41:11 | _b1 | &T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:41:15:41:16 | a1 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:41:15:41:24 | a1.deref() | | file://:0:0:0:0 | & | +| dereference.rs:41:15:41:24 | a1.deref() | &T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:44:9:44:10 | a2 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:44:14:44:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:44:36:44:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:45:9:45:11 | _b2 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:45:15:45:17 | * ... | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:45:16:45:17 | a2 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:48:9:48:10 | a3 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:48:14:48:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:48:36:48:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:49:9:49:11 | _b3 | | {EXTERNAL LOCATION} | bool | +| dereference.rs:49:15:49:19 | (...) | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:49:15:49:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | +| dereference.rs:49:16:49:18 | * ... | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:49:17:49:18 | a3 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:54:9:54:10 | c1 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:54:9:54:10 | c1 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:54:14:54:42 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:54:14:54:42 | MySmartPointer {...} | T | {EXTERNAL LOCATION} | char | +| dereference.rs:54:38:54:40 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:55:9:55:11 | _d1 | | file://:0:0:0:0 | & | +| dereference.rs:55:9:55:11 | _d1 | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:55:15:55:16 | c1 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:55:15:55:16 | c1 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:55:15:55:24 | c1.deref() | | file://:0:0:0:0 | & | +| dereference.rs:55:15:55:24 | c1.deref() | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:58:9:58:10 | c2 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:58:9:58:10 | c2 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:58:14:58:42 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:58:14:58:42 | MySmartPointer {...} | T | {EXTERNAL LOCATION} | char | +| dereference.rs:58:38:58:40 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:59:9:59:11 | _d2 | | {EXTERNAL LOCATION} | char | +| dereference.rs:59:15:59:17 | * ... | | {EXTERNAL LOCATION} | char | +| dereference.rs:59:16:59:17 | c2 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:59:16:59:17 | c2 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:62:9:62:10 | c3 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:62:9:62:10 | c3 | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:62:14:62:44 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:62:14:62:44 | MySmartPointer {...} | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:62:38:62:42 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:63:9:63:11 | _d3 | | {EXTERNAL LOCATION} | bool | +| dereference.rs:63:15:63:19 | (...) | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:63:15:63:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | +| dereference.rs:63:16:63:18 | * ... | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:63:17:63:18 | c3 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:63:17:63:18 | c3 | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:68:9:68:10 | e1 | | file://:0:0:0:0 | & | +| dereference.rs:68:9:68:10 | e1 | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:68:9:68:10 | e1 | &T | file://:0:0:0:0 | & | +| dereference.rs:68:14:68:17 | &'a' | | file://:0:0:0:0 | & | +| dereference.rs:68:14:68:17 | &'a' | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:68:14:68:17 | &'a' | &T | file://:0:0:0:0 | & | +| dereference.rs:68:15:68:17 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:69:9:69:11 | _f1 | | file://:0:0:0:0 | & | +| dereference.rs:69:15:69:16 | e1 | | file://:0:0:0:0 | & | +| dereference.rs:69:15:69:16 | e1 | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:69:15:69:16 | e1 | &T | file://:0:0:0:0 | & | +| dereference.rs:69:15:69:24 | e1.deref() | | file://:0:0:0:0 | & | +| dereference.rs:72:9:72:10 | e2 | | file://:0:0:0:0 | & | +| dereference.rs:72:9:72:10 | e2 | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:72:14:72:17 | &'a' | | file://:0:0:0:0 | & | +| dereference.rs:72:14:72:17 | &'a' | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:72:15:72:17 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:73:9:73:11 | _f2 | | {EXTERNAL LOCATION} | char | +| dereference.rs:73:15:73:17 | * ... | | {EXTERNAL LOCATION} | char | +| dereference.rs:73:16:73:17 | e2 | | file://:0:0:0:0 | & | +| dereference.rs:73:16:73:17 | e2 | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:76:9:76:10 | e3 | | file://:0:0:0:0 | & | +| dereference.rs:76:9:76:10 | e3 | &T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:76:14:76:19 | &34i64 | | file://:0:0:0:0 | & | +| dereference.rs:76:14:76:19 | &34i64 | &T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:76:15:76:19 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:77:9:77:11 | _f3 | | {EXTERNAL LOCATION} | bool | +| dereference.rs:77:15:77:19 | (...) | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:77:15:77:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | +| dereference.rs:77:16:77:18 | * ... | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:77:17:77:18 | e3 | | file://:0:0:0:0 | & | +| dereference.rs:77:17:77:18 | e3 | &T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:82:9:82:10 | g1 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:82:9:82:10 | g1 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:82:9:82:10 | g1 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:82:25:82:37 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| dereference.rs:82:25:82:37 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:82:25:82:37 | ...::new(...) | T | {EXTERNAL LOCATION} | char | +| dereference.rs:82:34:82:36 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:83:9:83:11 | _h1 | | file://:0:0:0:0 | & | +| dereference.rs:83:9:83:11 | _h1 | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:83:15:83:16 | g1 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:83:15:83:16 | g1 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:83:15:83:16 | g1 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:83:15:83:24 | g1.deref() | | file://:0:0:0:0 | & | +| dereference.rs:83:15:83:24 | g1.deref() | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:86:9:86:10 | g2 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:86:9:86:10 | g2 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:86:9:86:10 | g2 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:86:25:86:37 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| dereference.rs:86:25:86:37 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:86:25:86:37 | ...::new(...) | T | {EXTERNAL LOCATION} | char | +| dereference.rs:86:34:86:36 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:87:9:87:11 | _h2 | | {EXTERNAL LOCATION} | char | +| dereference.rs:87:15:87:17 | * ... | | {EXTERNAL LOCATION} | char | +| dereference.rs:87:16:87:17 | g2 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:87:16:87:17 | g2 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:87:16:87:17 | g2 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:90:9:90:10 | g3 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:90:9:90:10 | g3 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:90:9:90:10 | g3 | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:90:24:90:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| dereference.rs:90:24:90:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:90:24:90:38 | ...::new(...) | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:90:33:90:37 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:91:9:91:11 | _h3 | | {EXTERNAL LOCATION} | bool | +| dereference.rs:91:15:91:19 | (...) | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:91:15:91:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | +| dereference.rs:91:16:91:18 | * ... | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:91:17:91:18 | g3 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:91:17:91:18 | g3 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:91:17:91:18 | g3 | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:96:9:96:9 | x | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:96:13:96:41 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:96:35:96:39 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:97:14:97:14 | x | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:100:9:100:9 | x | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:100:9:100:9 | x | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:100:13:100:43 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:100:13:100:43 | MySmartPointer {...} | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:100:37:100:41 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:101:14:101:14 | x | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:101:14:101:14 | x | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:103:9:103:9 | z | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:103:9:103:9 | z | T | dereference.rs:30:1:30:15 | S | +| dereference.rs:103:9:103:9 | z | T.T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:103:13:103:45 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:103:13:103:45 | MySmartPointer {...} | T | dereference.rs:30:1:30:15 | S | +| dereference.rs:103:13:103:45 | MySmartPointer {...} | T.T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:103:37:103:43 | S(...) | | dereference.rs:30:1:30:15 | S | +| dereference.rs:103:37:103:43 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:103:39:103:42 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:104:14:104:14 | z | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:104:14:104:14 | z | T | dereference.rs:30:1:30:15 | S | +| dereference.rs:104:14:104:14 | z | T.T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:132:17:132:26 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:132:17:132:26 | key_to_key | K | file://:0:0:0:0 | & | +| dereference.rs:132:17:132:26 | key_to_key | K.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:17:132:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:132:17:132:26 | key_to_key | V | file://:0:0:0:0 | & | +| dereference.rs:132:17:132:26 | key_to_key | V.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:30:132:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:132:30:132:57 | ...::new(...) | K | file://:0:0:0:0 | & | +| dereference.rs:132:30:132:57 | ...::new(...) | K.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:30:132:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:132:30:132:57 | ...::new(...) | V | file://:0:0:0:0 | & | +| dereference.rs:132:30:132:57 | ...::new(...) | V.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:17:133:19 | key | | file://:0:0:0:0 | & | +| dereference.rs:133:17:133:19 | key | &T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:17:133:19 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:133:17:133:19 | key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:23:133:29 | &... | | file://:0:0:0:0 | & | +| dereference.rs:133:23:133:29 | &... | &T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:23:133:29 | &... | &T | file://:0:0:0:0 | & | +| dereference.rs:133:23:133:29 | &... | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:24:133:29 | Key {...} | | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:24:133:29 | Key {...} | | file://:0:0:0:0 | & | +| dereference.rs:133:24:133:29 | Key {...} | &T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:16:134:28 | Some(...) | | {EXTERNAL LOCATION} | Option | +| dereference.rs:134:16:134:28 | Some(...) | T | file://:0:0:0:0 | & | +| dereference.rs:134:16:134:28 | Some(...) | T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:16:134:28 | Some(...) | T.&T | file://:0:0:0:0 | & | +| dereference.rs:134:16:134:28 | Some(...) | T.&T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:21:134:27 | ref_key | | file://:0:0:0:0 | & | +| dereference.rs:134:21:134:27 | ref_key | &T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:21:134:27 | ref_key | &T | file://:0:0:0:0 | & | +| dereference.rs:134:21:134:27 | ref_key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:32:134:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:134:32:134:41 | key_to_key | K | file://:0:0:0:0 | & | +| dereference.rs:134:32:134:41 | key_to_key | K.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:32:134:41 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:134:32:134:41 | key_to_key | V | file://:0:0:0:0 | & | +| dereference.rs:134:32:134:41 | key_to_key | V.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:32:134:50 | key_to_key.get(...) | | {EXTERNAL LOCATION} | Option | +| dereference.rs:134:32:134:50 | key_to_key.get(...) | T | file://:0:0:0:0 | & | +| dereference.rs:134:32:134:50 | key_to_key.get(...) | T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:32:134:50 | key_to_key.get(...) | T.&T | file://:0:0:0:0 | & | +| dereference.rs:134:32:134:50 | key_to_key.get(...) | T.&T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:47:134:49 | key | | file://:0:0:0:0 | & | +| dereference.rs:134:47:134:49 | key | &T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:47:134:49 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:134:47:134:49 | key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:136:13:136:15 | key | | file://:0:0:0:0 | & | +| dereference.rs:136:13:136:15 | key | &T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:136:13:136:15 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:136:13:136:15 | key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:136:13:136:25 | ... = ... | | file://:0:0:0:0 | () | +| dereference.rs:136:19:136:25 | ref_key | | file://:0:0:0:0 | & | +| dereference.rs:136:19:136:25 | ref_key | &T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:136:19:136:25 | ref_key | &T | file://:0:0:0:0 | & | +| dereference.rs:136:19:136:25 | ref_key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:9:138:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:138:9:138:18 | key_to_key | K | file://:0:0:0:0 | & | +| dereference.rs:138:9:138:18 | key_to_key | K.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:9:138:18 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:138:9:138:18 | key_to_key | V | file://:0:0:0:0 | & | +| dereference.rs:138:9:138:18 | key_to_key | V.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:9:138:35 | key_to_key.insert(...) | | {EXTERNAL LOCATION} | Option | +| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T | file://:0:0:0:0 | & | +| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T.&T | file://:0:0:0:0 | & | +| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T.&T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:27:138:29 | key | | file://:0:0:0:0 | & | +| dereference.rs:138:27:138:29 | key | &T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:27:138:29 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:138:27:138:29 | key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:32:138:34 | key | | file://:0:0:0:0 | & | +| dereference.rs:138:32:138:34 | key | &T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:32:138:34 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:138:32:138:34 | key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:144:16:144:19 | SelfParam | | dereference.rs:143:5:145:5 | Self [trait MyTrait1] | +| dereference.rs:151:16:151:19 | SelfParam | | file://:0:0:0:0 | & | +| dereference.rs:151:16:151:19 | SelfParam | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:151:27:153:9 | { ... } | | dereference.rs:147:5:147:13 | S | +| dereference.rs:152:13:152:13 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:158:16:158:19 | SelfParam | | file://:0:0:0:0 | & | +| dereference.rs:158:16:158:19 | SelfParam | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:158:29:160:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:159:13:159:14 | 42 | | {EXTERNAL LOCATION} | i32 | +| dereference.rs:159:13:159:14 | 42 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:164:16:164:19 | SelfParam | | dereference.rs:163:5:165:5 | Self [trait MyTrait2] | +| dereference.rs:164:22:164:24 | arg | | dereference.rs:163:20:163:21 | T1 | +| dereference.rs:169:16:169:19 | SelfParam | | dereference.rs:147:5:147:13 | S | +| dereference.rs:169:22:169:24 | arg | | file://:0:0:0:0 | & | +| dereference.rs:169:22:169:24 | arg | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:169:36:171:9 | { ... } | | dereference.rs:147:5:147:13 | S | +| dereference.rs:170:13:170:13 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:176:16:176:19 | SelfParam | | dereference.rs:147:5:147:13 | S | +| dereference.rs:176:22:176:24 | arg | | file://:0:0:0:0 | & | +| dereference.rs:176:22:176:24 | arg | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:176:42:178:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:177:13:177:14 | 42 | | {EXTERNAL LOCATION} | i32 | +| dereference.rs:177:13:177:14 | 42 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:182:17:182:20 | (...) | | file://:0:0:0:0 | & | +| dereference.rs:182:17:182:20 | (...) | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:182:18:182:19 | &S | | file://:0:0:0:0 | & | +| dereference.rs:182:18:182:19 | &S | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:182:19:182:19 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:183:17:183:17 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:184:17:184:24 | (...) | | file://:0:0:0:0 | & | +| dereference.rs:184:17:184:24 | (...) | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:184:18:184:23 | &mut S | | file://:0:0:0:0 | & | +| dereference.rs:184:18:184:23 | &mut S | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:184:23:184:23 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:186:13:186:13 | x | | dereference.rs:147:5:147:13 | S | +| dereference.rs:186:13:186:13 | x | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:186:17:186:17 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:186:17:186:25 | S.bar(...) | | dereference.rs:147:5:147:13 | S | +| dereference.rs:186:17:186:25 | S.bar(...) | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:186:23:186:24 | &S | | file://:0:0:0:0 | & | +| dereference.rs:186:23:186:24 | &S | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:186:24:186:24 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:187:13:187:13 | y | | dereference.rs:147:5:147:13 | S | +| dereference.rs:187:13:187:13 | y | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:187:17:187:17 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:187:17:187:29 | S.bar(...) | | dereference.rs:147:5:147:13 | S | +| dereference.rs:187:17:187:29 | S.bar(...) | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:187:23:187:28 | &mut S | | file://:0:0:0:0 | & | +| dereference.rs:187:23:187:28 | &mut S | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:187:28:187:28 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:196:16:196:20 | SelfParam | | file://:0:0:0:0 | & | +| dereference.rs:196:16:196:20 | SelfParam | &T | dereference.rs:195:5:197:5 | Self [trait Bar] | +| dereference.rs:201:16:201:24 | SelfParam | | file://:0:0:0:0 | & | +| dereference.rs:201:16:201:24 | SelfParam | &T | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:202:22:202:38 | "In struct impl!\\n" | | file://:0:0:0:0 | & | +| dereference.rs:202:22:202:38 | "In struct impl!\\n" | &T | {EXTERNAL LOCATION} | str | +| dereference.rs:202:22:202:38 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| dereference.rs:202:22:202:38 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| dereference.rs:208:16:208:20 | SelfParam | | file://:0:0:0:0 | & | +| dereference.rs:208:16:208:20 | SelfParam | &T | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:209:22:209:37 | "In trait impl!\\n" | | file://:0:0:0:0 | & | +| dereference.rs:209:22:209:37 | "In trait impl!\\n" | &T | {EXTERNAL LOCATION} | str | +| dereference.rs:209:22:209:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| dereference.rs:209:22:209:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| dereference.rs:214:17:214:17 | f | | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:214:21:214:26 | Foo {...} | | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:215:9:215:9 | f | | dereference.rs:193:5:193:17 | Foo | | dyn_type.rs:7:10:7:14 | SelfParam | | file://:0:0:0:0 | & | | dyn_type.rs:7:10:7:14 | SelfParam | &T | dyn_type.rs:5:1:8:1 | Self [trait MyTrait1] | | dyn_type.rs:12:12:12:16 | SelfParam | | file://:0:0:0:0 | & | @@ -1892,18 +1982,22 @@ inferType | main.rs:956:26:956:26 | y | A | main.rs:939:5:940:14 | S2 | | main.rs:956:26:956:31 | y.m1() | | main.rs:939:5:940:14 | S2 | | main.rs:978:15:978:18 | SelfParam | | main.rs:976:5:979:5 | Self [trait MyTrait1] | -| main.rs:983:15:983:18 | SelfParam | | main.rs:981:5:993:5 | Self [trait MyTrait2] | +| main.rs:983:15:983:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:983:15:983:19 | SelfParam | &T | main.rs:981:5:993:5 | Self [trait MyTrait2] | | main.rs:986:9:992:9 | { ... } | | main.rs:981:20:981:22 | Tr2 | | main.rs:987:13:991:13 | if ... {...} else {...} | | main.rs:981:20:981:22 | Tr2 | | main.rs:987:16:987:16 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:987:16:987:20 | ... > ... | | {EXTERNAL LOCATION} | bool | | main.rs:987:20:987:20 | 2 | | {EXTERNAL LOCATION} | i32 | | main.rs:987:22:989:13 | { ... } | | main.rs:981:20:981:22 | Tr2 | -| main.rs:988:17:988:20 | self | | main.rs:981:5:993:5 | Self [trait MyTrait2] | +| main.rs:988:17:988:20 | self | | file://:0:0:0:0 | & | +| main.rs:988:17:988:20 | self | &T | main.rs:981:5:993:5 | Self [trait MyTrait2] | | main.rs:988:17:988:25 | self.m1() | | main.rs:981:20:981:22 | Tr2 | | main.rs:989:20:991:13 | { ... } | | main.rs:981:20:981:22 | Tr2 | -| main.rs:990:17:990:30 | ...::m1(...) | | main.rs:981:20:981:22 | Tr2 | -| main.rs:990:26:990:29 | self | | main.rs:981:5:993:5 | Self [trait MyTrait2] | +| main.rs:990:17:990:31 | ...::m1(...) | | main.rs:981:20:981:22 | Tr2 | +| main.rs:990:26:990:30 | * ... | | main.rs:981:5:993:5 | Self [trait MyTrait2] | +| main.rs:990:27:990:30 | self | | file://:0:0:0:0 | & | +| main.rs:990:27:990:30 | self | &T | main.rs:981:5:993:5 | Self [trait MyTrait2] | | main.rs:997:15:997:18 | SelfParam | | main.rs:995:5:1007:5 | Self [trait MyTrait3] | | main.rs:1000:9:1006:9 | { ... } | | main.rs:995:20:995:22 | Tr3 | | main.rs:1001:13:1005:13 | if ... {...} else {...} | | main.rs:995:20:995:22 | Tr3 | @@ -1916,10 +2010,12 @@ inferType | main.rs:1002:17:1002:25 | self.m2() | A | main.rs:995:20:995:22 | Tr3 | | main.rs:1002:17:1002:27 | ... .a | | main.rs:995:20:995:22 | Tr3 | | main.rs:1003:20:1005:13 | { ... } | | main.rs:995:20:995:22 | Tr3 | -| main.rs:1004:17:1004:30 | ...::m2(...) | | main.rs:961:5:964:5 | MyThing | -| main.rs:1004:17:1004:30 | ...::m2(...) | A | main.rs:995:20:995:22 | Tr3 | -| main.rs:1004:17:1004:32 | ... .a | | main.rs:995:20:995:22 | Tr3 | -| main.rs:1004:26:1004:29 | self | | main.rs:995:5:1007:5 | Self [trait MyTrait3] | +| main.rs:1004:17:1004:31 | ...::m2(...) | | main.rs:961:5:964:5 | MyThing | +| main.rs:1004:17:1004:31 | ...::m2(...) | A | main.rs:995:20:995:22 | Tr3 | +| main.rs:1004:17:1004:33 | ... .a | | main.rs:995:20:995:22 | Tr3 | +| main.rs:1004:26:1004:30 | &self | | file://:0:0:0:0 | & | +| main.rs:1004:26:1004:30 | &self | &T | main.rs:995:5:1007:5 | Self [trait MyTrait3] | +| main.rs:1004:27:1004:30 | self | | main.rs:995:5:1007:5 | Self [trait MyTrait3] | | main.rs:1011:15:1011:18 | SelfParam | | main.rs:961:5:964:5 | MyThing | | main.rs:1011:15:1011:18 | SelfParam | A | main.rs:1009:10:1009:10 | T | | main.rs:1011:26:1013:9 | { ... } | | main.rs:1009:10:1009:10 | T | @@ -3465,1560 +3561,1578 @@ inferType | main.rs:1819:44:1819:48 | other | | file://:0:0:0:0 | & | | main.rs:1819:44:1819:48 | other | &T | main.rs:1586:5:1591:5 | Vec2 | | main.rs:1819:44:1819:50 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1826:13:1826:18 | i64_eq | | {EXTERNAL LOCATION} | bool | -| main.rs:1826:22:1826:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1826:23:1826:26 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1826:23:1826:34 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1826:31:1826:34 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1827:13:1827:18 | i64_ne | | {EXTERNAL LOCATION} | bool | -| main.rs:1827:22:1827:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1827:23:1827:26 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1827:23:1827:34 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1827:31:1827:34 | 4i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1828:13:1828:18 | i64_lt | | {EXTERNAL LOCATION} | bool | -| main.rs:1828:22:1828:34 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1828:23:1828:26 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1828:23:1828:33 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1828:30:1828:33 | 6i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1829:13:1829:18 | i64_le | | {EXTERNAL LOCATION} | bool | -| main.rs:1829:22:1829:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1829:23:1829:26 | 7i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1829:23:1829:34 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1829:31:1829:34 | 8i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1830:13:1830:18 | i64_gt | | {EXTERNAL LOCATION} | bool | -| main.rs:1830:22:1830:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1830:23:1830:26 | 9i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1830:23:1830:34 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1830:30:1830:34 | 10i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1831:13:1831:18 | i64_ge | | {EXTERNAL LOCATION} | bool | -| main.rs:1831:22:1831:37 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1831:23:1831:27 | 11i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1831:23:1831:36 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1831:32:1831:36 | 12i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1834:13:1834:19 | i64_add | | {EXTERNAL LOCATION} | i64 | -| main.rs:1834:23:1834:27 | 13i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1834:23:1834:35 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1834:31:1834:35 | 14i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1835:13:1835:19 | i64_sub | | {EXTERNAL LOCATION} | i64 | -| main.rs:1835:23:1835:27 | 15i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1835:23:1835:35 | ... - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1835:31:1835:35 | 16i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1836:13:1836:19 | i64_mul | | {EXTERNAL LOCATION} | i64 | -| main.rs:1836:23:1836:27 | 17i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1836:23:1836:35 | ... * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1836:31:1836:35 | 18i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1837:13:1837:19 | i64_div | | {EXTERNAL LOCATION} | i64 | -| main.rs:1837:23:1837:27 | 19i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1837:23:1837:35 | ... / ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1837:31:1837:35 | 20i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1838:13:1838:19 | i64_rem | | {EXTERNAL LOCATION} | i64 | -| main.rs:1838:23:1838:27 | 21i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1838:23:1838:35 | ... % ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1838:31:1838:35 | 22i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1841:17:1841:30 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1841:34:1841:38 | 23i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1842:9:1842:22 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1842:9:1842:31 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:1842:27:1842:31 | 24i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1844:17:1844:30 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1844:34:1844:38 | 25i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1845:9:1845:22 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1845:9:1845:31 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:1845:27:1845:31 | 26i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1847:17:1847:30 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1847:34:1847:38 | 27i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1848:9:1848:22 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1848:9:1848:31 | ... *= ... | | file://:0:0:0:0 | () | -| main.rs:1848:27:1848:31 | 28i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1850:17:1850:30 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1850:34:1850:38 | 29i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1851:9:1851:22 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1851:9:1851:31 | ... /= ... | | file://:0:0:0:0 | () | -| main.rs:1851:27:1851:31 | 30i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1853:17:1853:30 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1853:34:1853:38 | 31i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1854:9:1854:22 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1854:9:1854:31 | ... %= ... | | file://:0:0:0:0 | () | -| main.rs:1854:27:1854:31 | 32i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1857:13:1857:22 | i64_bitand | | {EXTERNAL LOCATION} | i64 | -| main.rs:1857:26:1857:30 | 33i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1857:26:1857:38 | ... & ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1857:34:1857:38 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1858:13:1858:21 | i64_bitor | | {EXTERNAL LOCATION} | i64 | -| main.rs:1858:25:1858:29 | 35i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1858:25:1858:37 | ... \| ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1858:33:1858:37 | 36i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1859:13:1859:22 | i64_bitxor | | {EXTERNAL LOCATION} | i64 | -| main.rs:1859:26:1859:30 | 37i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1859:26:1859:38 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1859:34:1859:38 | 38i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1860:13:1860:19 | i64_shl | | {EXTERNAL LOCATION} | i64 | -| main.rs:1860:23:1860:27 | 39i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1860:23:1860:36 | ... << ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1860:32:1860:36 | 40i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1861:13:1861:19 | i64_shr | | {EXTERNAL LOCATION} | i64 | -| main.rs:1861:23:1861:27 | 41i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1861:23:1861:36 | ... >> ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1861:32:1861:36 | 42i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1864:17:1864:33 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1864:37:1864:41 | 43i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1865:9:1865:25 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1865:9:1865:34 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:1865:30:1865:34 | 44i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1867:17:1867:32 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1867:36:1867:40 | 45i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1868:9:1868:24 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1868:9:1868:33 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:1868:29:1868:33 | 46i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1870:17:1870:33 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1870:37:1870:41 | 47i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1871:9:1871:25 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1871:9:1871:34 | ... ^= ... | | file://:0:0:0:0 | () | -| main.rs:1871:30:1871:34 | 48i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1873:17:1873:30 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1873:34:1873:38 | 49i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1874:9:1874:22 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1874:9:1874:32 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:1874:28:1874:32 | 50i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1876:17:1876:30 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1876:34:1876:38 | 51i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1877:9:1877:22 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1877:9:1877:32 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:1877:28:1877:32 | 52i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1879:13:1879:19 | i64_neg | | {EXTERNAL LOCATION} | i64 | -| main.rs:1879:23:1879:28 | - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1879:24:1879:28 | 53i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1880:13:1880:19 | i64_not | | {EXTERNAL LOCATION} | i64 | -| main.rs:1880:23:1880:28 | ! ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1880:24:1880:28 | 54i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1883:13:1883:14 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1883:18:1883:36 | Vec2 {...} | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1883:28:1883:28 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1883:28:1883:28 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1883:34:1883:34 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1883:34:1883:34 | 2 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1884:13:1884:14 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1884:18:1884:36 | Vec2 {...} | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1884:28:1884:28 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1884:28:1884:28 | 3 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1884:34:1884:34 | 4 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1884:34:1884:34 | 4 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1887:13:1887:19 | vec2_eq | | {EXTERNAL LOCATION} | bool | -| main.rs:1887:23:1887:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1887:23:1887:30 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1887:29:1887:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1888:13:1888:19 | vec2_ne | | {EXTERNAL LOCATION} | bool | -| main.rs:1888:23:1888:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1888:23:1888:30 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1888:29:1888:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1889:13:1889:19 | vec2_lt | | {EXTERNAL LOCATION} | bool | -| main.rs:1889:23:1889:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1889:23:1889:29 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1889:28:1889:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1890:13:1890:19 | vec2_le | | {EXTERNAL LOCATION} | bool | -| main.rs:1890:23:1890:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1890:23:1890:30 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1890:29:1890:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1891:13:1891:19 | vec2_gt | | {EXTERNAL LOCATION} | bool | -| main.rs:1891:23:1891:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1891:23:1891:29 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1891:28:1891:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1892:13:1892:19 | vec2_ge | | {EXTERNAL LOCATION} | bool | -| main.rs:1892:23:1892:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1892:23:1892:30 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1892:29:1892:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1895:13:1895:20 | vec2_add | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1895:24:1895:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1895:24:1895:30 | ... + ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1895:29:1895:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1896:13:1896:20 | vec2_sub | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1896:24:1896:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1896:24:1896:30 | ... - ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1823:26:1823:26 | a | | main.rs:1823:18:1823:23 | T | +| main.rs:1823:32:1823:32 | b | | main.rs:1823:18:1823:23 | T | +| main.rs:1823:51:1825:5 | { ... } | | {EXTERNAL LOCATION} | Output | +| main.rs:1824:9:1824:9 | a | | main.rs:1823:18:1823:23 | T | +| main.rs:1824:9:1824:13 | ... + ... | | {EXTERNAL LOCATION} | Output | +| main.rs:1824:13:1824:13 | b | | main.rs:1823:18:1823:23 | T | +| main.rs:1831:13:1831:18 | i64_eq | | {EXTERNAL LOCATION} | bool | +| main.rs:1831:22:1831:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1831:23:1831:26 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1831:23:1831:34 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1831:31:1831:34 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1832:13:1832:18 | i64_ne | | {EXTERNAL LOCATION} | bool | +| main.rs:1832:22:1832:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1832:23:1832:26 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1832:23:1832:34 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1832:31:1832:34 | 4i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1833:13:1833:18 | i64_lt | | {EXTERNAL LOCATION} | bool | +| main.rs:1833:22:1833:34 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1833:23:1833:26 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1833:23:1833:33 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1833:30:1833:33 | 6i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1834:13:1834:18 | i64_le | | {EXTERNAL LOCATION} | bool | +| main.rs:1834:22:1834:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1834:23:1834:26 | 7i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1834:23:1834:34 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1834:31:1834:34 | 8i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1835:13:1835:18 | i64_gt | | {EXTERNAL LOCATION} | bool | +| main.rs:1835:22:1835:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1835:23:1835:26 | 9i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1835:23:1835:34 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1835:30:1835:34 | 10i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1836:13:1836:18 | i64_ge | | {EXTERNAL LOCATION} | bool | +| main.rs:1836:22:1836:37 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1836:23:1836:27 | 11i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1836:23:1836:36 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1836:32:1836:36 | 12i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1839:13:1839:19 | i64_add | | {EXTERNAL LOCATION} | i64 | +| main.rs:1839:23:1839:27 | 13i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1839:23:1839:35 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1839:31:1839:35 | 14i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1840:13:1840:19 | i64_sub | | {EXTERNAL LOCATION} | i64 | +| main.rs:1840:23:1840:27 | 15i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1840:23:1840:35 | ... - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1840:31:1840:35 | 16i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1841:13:1841:19 | i64_mul | | {EXTERNAL LOCATION} | i64 | +| main.rs:1841:23:1841:27 | 17i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1841:23:1841:35 | ... * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1841:31:1841:35 | 18i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1842:13:1842:19 | i64_div | | {EXTERNAL LOCATION} | i64 | +| main.rs:1842:23:1842:27 | 19i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1842:23:1842:35 | ... / ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1842:31:1842:35 | 20i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1843:13:1843:19 | i64_rem | | {EXTERNAL LOCATION} | i64 | +| main.rs:1843:23:1843:27 | 21i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1843:23:1843:35 | ... % ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1843:31:1843:35 | 22i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1844:39:1844:42 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1844:45:1844:48 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1847:17:1847:30 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1847:34:1847:38 | 23i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1848:9:1848:22 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1848:9:1848:31 | ... += ... | | file://:0:0:0:0 | () | +| main.rs:1848:27:1848:31 | 24i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1850:17:1850:30 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1850:34:1850:38 | 25i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1851:9:1851:22 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1851:9:1851:31 | ... -= ... | | file://:0:0:0:0 | () | +| main.rs:1851:27:1851:31 | 26i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1853:17:1853:30 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1853:34:1853:38 | 27i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1854:9:1854:22 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1854:9:1854:31 | ... *= ... | | file://:0:0:0:0 | () | +| main.rs:1854:27:1854:31 | 28i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1856:17:1856:30 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1856:34:1856:38 | 29i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1857:9:1857:22 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1857:9:1857:31 | ... /= ... | | file://:0:0:0:0 | () | +| main.rs:1857:27:1857:31 | 30i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1859:17:1859:30 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1859:34:1859:38 | 31i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1860:9:1860:22 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1860:9:1860:31 | ... %= ... | | file://:0:0:0:0 | () | +| main.rs:1860:27:1860:31 | 32i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1863:13:1863:22 | i64_bitand | | {EXTERNAL LOCATION} | i64 | +| main.rs:1863:26:1863:30 | 33i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1863:26:1863:38 | ... & ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1863:34:1863:38 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1864:13:1864:21 | i64_bitor | | {EXTERNAL LOCATION} | i64 | +| main.rs:1864:25:1864:29 | 35i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1864:25:1864:37 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1864:33:1864:37 | 36i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1865:13:1865:22 | i64_bitxor | | {EXTERNAL LOCATION} | i64 | +| main.rs:1865:26:1865:30 | 37i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1865:26:1865:38 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1865:34:1865:38 | 38i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1866:13:1866:19 | i64_shl | | {EXTERNAL LOCATION} | i64 | +| main.rs:1866:23:1866:27 | 39i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1866:23:1866:36 | ... << ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1866:32:1866:36 | 40i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1867:13:1867:19 | i64_shr | | {EXTERNAL LOCATION} | i64 | +| main.rs:1867:23:1867:27 | 41i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1867:23:1867:36 | ... >> ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1867:32:1867:36 | 42i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1870:17:1870:33 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1870:37:1870:41 | 43i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1871:9:1871:25 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1871:9:1871:34 | ... &= ... | | file://:0:0:0:0 | () | +| main.rs:1871:30:1871:34 | 44i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1873:17:1873:32 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1873:36:1873:40 | 45i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1874:9:1874:24 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1874:9:1874:33 | ... \|= ... | | file://:0:0:0:0 | () | +| main.rs:1874:29:1874:33 | 46i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1876:17:1876:33 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1876:37:1876:41 | 47i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1877:9:1877:25 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1877:9:1877:34 | ... ^= ... | | file://:0:0:0:0 | () | +| main.rs:1877:30:1877:34 | 48i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1879:17:1879:30 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1879:34:1879:38 | 49i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1880:9:1880:22 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1880:9:1880:32 | ... <<= ... | | file://:0:0:0:0 | () | +| main.rs:1880:28:1880:32 | 50i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1882:17:1882:30 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1882:34:1882:38 | 51i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1883:9:1883:22 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1883:9:1883:32 | ... >>= ... | | file://:0:0:0:0 | () | +| main.rs:1883:28:1883:32 | 52i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1885:13:1885:19 | i64_neg | | {EXTERNAL LOCATION} | i64 | +| main.rs:1885:23:1885:28 | - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1885:24:1885:28 | 53i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1886:13:1886:19 | i64_not | | {EXTERNAL LOCATION} | i64 | +| main.rs:1886:23:1886:28 | ! ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1886:24:1886:28 | 54i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1889:13:1889:14 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1889:18:1889:36 | Vec2 {...} | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1889:28:1889:28 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1889:28:1889:28 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1889:34:1889:34 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1889:34:1889:34 | 2 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1890:13:1890:14 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1890:18:1890:36 | Vec2 {...} | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1890:28:1890:28 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1890:28:1890:28 | 3 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1890:34:1890:34 | 4 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1890:34:1890:34 | 4 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1893:13:1893:19 | vec2_eq | | {EXTERNAL LOCATION} | bool | +| main.rs:1893:23:1893:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1893:23:1893:30 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1893:29:1893:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1894:13:1894:19 | vec2_ne | | {EXTERNAL LOCATION} | bool | +| main.rs:1894:23:1894:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1894:23:1894:30 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1894:29:1894:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1895:13:1895:19 | vec2_lt | | {EXTERNAL LOCATION} | bool | +| main.rs:1895:23:1895:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1895:23:1895:29 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1895:28:1895:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1896:13:1896:19 | vec2_le | | {EXTERNAL LOCATION} | bool | +| main.rs:1896:23:1896:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1896:23:1896:30 | ... <= ... | | {EXTERNAL LOCATION} | bool | | main.rs:1896:29:1896:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1897:13:1897:20 | vec2_mul | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1897:24:1897:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1897:24:1897:30 | ... * ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1897:29:1897:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1898:13:1898:20 | vec2_div | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1898:24:1898:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1898:24:1898:30 | ... / ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1897:13:1897:19 | vec2_gt | | {EXTERNAL LOCATION} | bool | +| main.rs:1897:23:1897:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1897:23:1897:29 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1897:28:1897:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1898:13:1898:19 | vec2_ge | | {EXTERNAL LOCATION} | bool | +| main.rs:1898:23:1898:24 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1898:23:1898:30 | ... >= ... | | {EXTERNAL LOCATION} | bool | | main.rs:1898:29:1898:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1899:13:1899:20 | vec2_rem | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1899:24:1899:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1899:24:1899:30 | ... % ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1899:29:1899:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1902:17:1902:31 | vec2_add_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1902:35:1902:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1903:9:1903:23 | vec2_add_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1903:9:1903:29 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:1903:28:1903:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1905:17:1905:31 | vec2_sub_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1905:35:1905:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1906:9:1906:23 | vec2_sub_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1906:9:1906:29 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:1906:28:1906:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1908:17:1908:31 | vec2_mul_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1901:13:1901:20 | vec2_add | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1901:24:1901:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1901:24:1901:30 | ... + ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1901:29:1901:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1902:13:1902:20 | vec2_sub | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1902:24:1902:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1902:24:1902:30 | ... - ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1902:29:1902:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1903:13:1903:20 | vec2_mul | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1903:24:1903:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1903:24:1903:30 | ... * ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1903:29:1903:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1904:13:1904:20 | vec2_div | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1904:24:1904:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1904:24:1904:30 | ... / ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1904:29:1904:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1905:13:1905:20 | vec2_rem | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1905:24:1905:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1905:24:1905:30 | ... % ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1905:29:1905:30 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1908:17:1908:31 | vec2_add_assign | | main.rs:1586:5:1591:5 | Vec2 | | main.rs:1908:35:1908:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1909:9:1909:23 | vec2_mul_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1909:9:1909:29 | ... *= ... | | file://:0:0:0:0 | () | +| main.rs:1909:9:1909:23 | vec2_add_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1909:9:1909:29 | ... += ... | | file://:0:0:0:0 | () | | main.rs:1909:28:1909:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1911:17:1911:31 | vec2_div_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1911:17:1911:31 | vec2_sub_assign | | main.rs:1586:5:1591:5 | Vec2 | | main.rs:1911:35:1911:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1912:9:1912:23 | vec2_div_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1912:9:1912:29 | ... /= ... | | file://:0:0:0:0 | () | +| main.rs:1912:9:1912:23 | vec2_sub_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1912:9:1912:29 | ... -= ... | | file://:0:0:0:0 | () | | main.rs:1912:28:1912:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1914:17:1914:31 | vec2_rem_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1914:17:1914:31 | vec2_mul_assign | | main.rs:1586:5:1591:5 | Vec2 | | main.rs:1914:35:1914:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1915:9:1915:23 | vec2_rem_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1915:9:1915:29 | ... %= ... | | file://:0:0:0:0 | () | +| main.rs:1915:9:1915:23 | vec2_mul_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1915:9:1915:29 | ... *= ... | | file://:0:0:0:0 | () | | main.rs:1915:28:1915:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1918:13:1918:23 | vec2_bitand | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1918:27:1918:28 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1918:27:1918:33 | ... & ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1918:32:1918:33 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1919:13:1919:22 | vec2_bitor | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1919:26:1919:27 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1919:26:1919:32 | ... \| ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1919:31:1919:32 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1920:13:1920:23 | vec2_bitxor | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1920:27:1920:28 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1920:27:1920:33 | ... ^ ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1920:32:1920:33 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1921:13:1921:20 | vec2_shl | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1921:24:1921:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1921:24:1921:33 | ... << ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1921:30:1921:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:1922:13:1922:20 | vec2_shr | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1922:24:1922:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1922:24:1922:33 | ... >> ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1922:30:1922:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:1925:17:1925:34 | vec2_bitand_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1925:38:1925:39 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1926:9:1926:26 | vec2_bitand_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1926:9:1926:32 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:1926:31:1926:32 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1928:17:1928:33 | vec2_bitor_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1928:37:1928:38 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1929:9:1929:25 | vec2_bitor_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1929:9:1929:31 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:1929:30:1929:31 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1931:17:1931:34 | vec2_bitxor_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1917:17:1917:31 | vec2_div_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1917:35:1917:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1918:9:1918:23 | vec2_div_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1918:9:1918:29 | ... /= ... | | file://:0:0:0:0 | () | +| main.rs:1918:28:1918:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1920:17:1920:31 | vec2_rem_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1920:35:1920:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1921:9:1921:23 | vec2_rem_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1921:9:1921:29 | ... %= ... | | file://:0:0:0:0 | () | +| main.rs:1921:28:1921:29 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1924:13:1924:23 | vec2_bitand | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1924:27:1924:28 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1924:27:1924:33 | ... & ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1924:32:1924:33 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1925:13:1925:22 | vec2_bitor | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1925:26:1925:27 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1925:26:1925:32 | ... \| ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1925:31:1925:32 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1926:13:1926:23 | vec2_bitxor | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1926:27:1926:28 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1926:27:1926:33 | ... ^ ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1926:32:1926:33 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1927:13:1927:20 | vec2_shl | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1927:24:1927:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1927:24:1927:33 | ... << ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1927:30:1927:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:1928:13:1928:20 | vec2_shr | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1928:24:1928:25 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1928:24:1928:33 | ... >> ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1928:30:1928:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:1931:17:1931:34 | vec2_bitand_assign | | main.rs:1586:5:1591:5 | Vec2 | | main.rs:1931:38:1931:39 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1932:9:1932:26 | vec2_bitxor_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1932:9:1932:32 | ... ^= ... | | file://:0:0:0:0 | () | +| main.rs:1932:9:1932:26 | vec2_bitand_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1932:9:1932:32 | ... &= ... | | file://:0:0:0:0 | () | | main.rs:1932:31:1932:32 | v2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1934:17:1934:31 | vec2_shl_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1934:35:1934:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1935:9:1935:23 | vec2_shl_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1935:9:1935:32 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:1935:29:1935:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:1937:17:1937:31 | vec2_shr_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1937:35:1937:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1938:9:1938:23 | vec2_shr_assign | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1938:9:1938:32 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:1938:29:1938:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:1941:13:1941:20 | vec2_neg | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1941:24:1941:26 | - ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1941:25:1941:26 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1942:13:1942:20 | vec2_not | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1942:24:1942:26 | ! ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1942:25:1942:26 | v1 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1945:13:1945:24 | default_vec2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1945:28:1945:45 | ...::default(...) | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1946:13:1946:26 | vec2_zero_plus | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1946:30:1946:48 | Vec2 {...} | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1946:30:1946:63 | ... + ... | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1946:40:1946:40 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1946:40:1946:40 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1946:46:1946:46 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1946:46:1946:46 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1946:52:1946:63 | default_vec2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1950:13:1950:24 | default_vec2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1950:28:1950:45 | ...::default(...) | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1951:13:1951:26 | vec2_zero_plus | | {EXTERNAL LOCATION} | bool | -| main.rs:1951:30:1951:48 | Vec2 {...} | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1951:30:1951:64 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1951:40:1951:40 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1951:40:1951:40 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1951:46:1951:46 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1951:46:1951:46 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1951:53:1951:64 | default_vec2 | | main.rs:1586:5:1591:5 | Vec2 | -| main.rs:1961:18:1961:21 | SelfParam | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1964:25:1966:5 | { ... } | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1965:9:1965:10 | S1 | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1968:41:1970:5 | { ... } | | main.rs:1968:16:1968:39 | ImplTraitTypeRepr | -| main.rs:1969:9:1969:20 | { ... } | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1969:9:1969:20 | { ... } | Output | main.rs:1958:5:1958:14 | S1 | -| main.rs:1969:17:1969:18 | S1 | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1978:13:1978:42 | SelfParam | | {EXTERNAL LOCATION} | Pin | -| main.rs:1978:13:1978:42 | SelfParam | Ptr | file://:0:0:0:0 | & | -| main.rs:1978:13:1978:42 | SelfParam | Ptr.&T | main.rs:1972:5:1972:14 | S2 | -| main.rs:1979:13:1979:15 | _cx | | file://:0:0:0:0 | & | -| main.rs:1979:13:1979:15 | _cx | &T | {EXTERNAL LOCATION} | Context | -| main.rs:1980:44:1982:9 | { ... } | | {EXTERNAL LOCATION} | Poll | -| main.rs:1980:44:1982:9 | { ... } | T | main.rs:1958:5:1958:14 | S1 | -| main.rs:1981:13:1981:38 | ...::Ready(...) | | {EXTERNAL LOCATION} | Poll | -| main.rs:1981:13:1981:38 | ...::Ready(...) | T | main.rs:1958:5:1958:14 | S1 | -| main.rs:1981:36:1981:37 | S1 | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1985:41:1987:5 | { ... } | | main.rs:1985:16:1985:39 | ImplTraitTypeRepr | -| main.rs:1986:9:1986:10 | S2 | | main.rs:1972:5:1972:14 | S2 | -| main.rs:1986:9:1986:10 | S2 | | main.rs:1985:16:1985:39 | ImplTraitTypeRepr | -| main.rs:1990:9:1990:12 | f1(...) | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1990:9:1990:12 | f1(...) | Output | main.rs:1958:5:1958:14 | S1 | -| main.rs:1990:9:1990:18 | await ... | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1991:9:1991:12 | f2(...) | | main.rs:1968:16:1968:39 | ImplTraitTypeRepr | -| main.rs:1991:9:1991:18 | await ... | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1992:9:1992:12 | f3(...) | | main.rs:1985:16:1985:39 | ImplTraitTypeRepr | -| main.rs:1992:9:1992:18 | await ... | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1993:9:1993:10 | S2 | | main.rs:1972:5:1972:14 | S2 | -| main.rs:1993:9:1993:16 | await S2 | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1994:13:1994:13 | b | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1994:13:1994:13 | b | Output | main.rs:1958:5:1958:14 | S1 | -| main.rs:1994:17:1994:28 | { ... } | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1994:17:1994:28 | { ... } | Output | main.rs:1958:5:1958:14 | S1 | -| main.rs:1994:25:1994:26 | S1 | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1995:9:1995:9 | b | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1995:9:1995:9 | b | Output | main.rs:1958:5:1958:14 | S1 | -| main.rs:1995:9:1995:15 | await b | | main.rs:1958:5:1958:14 | S1 | -| main.rs:2006:15:2006:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2006:15:2006:19 | SelfParam | &T | main.rs:2005:5:2007:5 | Self [trait Trait1] | -| main.rs:2010:15:2010:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2010:15:2010:19 | SelfParam | &T | main.rs:2009:5:2011:5 | Self [trait Trait2] | -| main.rs:2014:15:2014:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2014:15:2014:19 | SelfParam | &T | main.rs:2000:5:2001:14 | S1 | -| main.rs:2018:15:2018:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2018:15:2018:19 | SelfParam | &T | main.rs:2000:5:2001:14 | S1 | -| main.rs:2021:37:2023:5 | { ... } | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2022:9:2022:10 | S1 | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2022:9:2022:10 | S1 | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2026:18:2026:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2026:18:2026:22 | SelfParam | &T | main.rs:2025:5:2027:5 | Self [trait MyTrait] | -| main.rs:2030:18:2030:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2030:18:2030:22 | SelfParam | &T | main.rs:2000:5:2001:14 | S1 | -| main.rs:2030:31:2032:9 | { ... } | | main.rs:2002:5:2002:14 | S2 | -| main.rs:2031:13:2031:14 | S2 | | main.rs:2002:5:2002:14 | S2 | +| main.rs:1934:17:1934:33 | vec2_bitor_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1934:37:1934:38 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1935:9:1935:25 | vec2_bitor_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1935:9:1935:31 | ... \|= ... | | file://:0:0:0:0 | () | +| main.rs:1935:30:1935:31 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1937:17:1937:34 | vec2_bitxor_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1937:38:1937:39 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1938:9:1938:26 | vec2_bitxor_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1938:9:1938:32 | ... ^= ... | | file://:0:0:0:0 | () | +| main.rs:1938:31:1938:32 | v2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1940:17:1940:31 | vec2_shl_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1940:35:1940:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1941:9:1941:23 | vec2_shl_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1941:9:1941:32 | ... <<= ... | | file://:0:0:0:0 | () | +| main.rs:1941:29:1941:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:1943:17:1943:31 | vec2_shr_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1943:35:1943:36 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1944:9:1944:23 | vec2_shr_assign | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1944:9:1944:32 | ... >>= ... | | file://:0:0:0:0 | () | +| main.rs:1944:29:1944:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:1947:13:1947:20 | vec2_neg | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1947:24:1947:26 | - ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1947:25:1947:26 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1948:13:1948:20 | vec2_not | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1948:24:1948:26 | ! ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1948:25:1948:26 | v1 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1951:13:1951:24 | default_vec2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1951:28:1951:45 | ...::default(...) | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1952:13:1952:26 | vec2_zero_plus | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1952:30:1952:48 | Vec2 {...} | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1952:30:1952:63 | ... + ... | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1952:40:1952:40 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1952:40:1952:40 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1952:46:1952:46 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1952:46:1952:46 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1952:52:1952:63 | default_vec2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1956:13:1956:24 | default_vec2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1956:28:1956:45 | ...::default(...) | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1957:13:1957:26 | vec2_zero_plus | | {EXTERNAL LOCATION} | bool | +| main.rs:1957:30:1957:48 | Vec2 {...} | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1957:30:1957:64 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1957:40:1957:40 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1957:40:1957:40 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1957:46:1957:46 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1957:46:1957:46 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1957:53:1957:64 | default_vec2 | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1967:18:1967:21 | SelfParam | | main.rs:1964:5:1964:14 | S1 | +| main.rs:1970:25:1972:5 | { ... } | | main.rs:1964:5:1964:14 | S1 | +| main.rs:1971:9:1971:10 | S1 | | main.rs:1964:5:1964:14 | S1 | +| main.rs:1974:41:1976:5 | { ... } | | main.rs:1974:16:1974:39 | ImplTraitTypeRepr | +| main.rs:1975:9:1975:20 | { ... } | | {EXTERNAL LOCATION} | trait Future | +| main.rs:1975:9:1975:20 | { ... } | Output | main.rs:1964:5:1964:14 | S1 | +| main.rs:1975:17:1975:18 | S1 | | main.rs:1964:5:1964:14 | S1 | +| main.rs:1984:13:1984:42 | SelfParam | | {EXTERNAL LOCATION} | Pin | +| main.rs:1984:13:1984:42 | SelfParam | Ptr | file://:0:0:0:0 | & | +| main.rs:1984:13:1984:42 | SelfParam | Ptr.&T | main.rs:1978:5:1978:14 | S2 | +| main.rs:1985:13:1985:15 | _cx | | file://:0:0:0:0 | & | +| main.rs:1985:13:1985:15 | _cx | &T | {EXTERNAL LOCATION} | Context | +| main.rs:1986:44:1988:9 | { ... } | | {EXTERNAL LOCATION} | Poll | +| main.rs:1986:44:1988:9 | { ... } | T | main.rs:1964:5:1964:14 | S1 | +| main.rs:1987:13:1987:38 | ...::Ready(...) | | {EXTERNAL LOCATION} | Poll | +| main.rs:1987:13:1987:38 | ...::Ready(...) | T | main.rs:1964:5:1964:14 | S1 | +| main.rs:1987:36:1987:37 | S1 | | main.rs:1964:5:1964:14 | S1 | +| main.rs:1991:41:1993:5 | { ... } | | main.rs:1991:16:1991:39 | ImplTraitTypeRepr | +| main.rs:1992:9:1992:10 | S2 | | main.rs:1978:5:1978:14 | S2 | +| main.rs:1992:9:1992:10 | S2 | | main.rs:1991:16:1991:39 | ImplTraitTypeRepr | +| main.rs:1996:9:1996:12 | f1(...) | | {EXTERNAL LOCATION} | trait Future | +| main.rs:1996:9:1996:12 | f1(...) | Output | main.rs:1964:5:1964:14 | S1 | +| main.rs:1996:9:1996:18 | await ... | | main.rs:1964:5:1964:14 | S1 | +| main.rs:1997:9:1997:12 | f2(...) | | main.rs:1974:16:1974:39 | ImplTraitTypeRepr | +| main.rs:1997:9:1997:18 | await ... | | main.rs:1964:5:1964:14 | S1 | +| main.rs:1998:9:1998:12 | f3(...) | | main.rs:1991:16:1991:39 | ImplTraitTypeRepr | +| main.rs:1998:9:1998:18 | await ... | | main.rs:1964:5:1964:14 | S1 | +| main.rs:1999:9:1999:10 | S2 | | main.rs:1978:5:1978:14 | S2 | +| main.rs:1999:9:1999:16 | await S2 | | main.rs:1964:5:1964:14 | S1 | +| main.rs:2000:13:2000:13 | b | | {EXTERNAL LOCATION} | trait Future | +| main.rs:2000:13:2000:13 | b | Output | main.rs:1964:5:1964:14 | S1 | +| main.rs:2000:17:2000:28 | { ... } | | {EXTERNAL LOCATION} | trait Future | +| main.rs:2000:17:2000:28 | { ... } | Output | main.rs:1964:5:1964:14 | S1 | +| main.rs:2000:25:2000:26 | S1 | | main.rs:1964:5:1964:14 | S1 | +| main.rs:2001:9:2001:9 | b | | {EXTERNAL LOCATION} | trait Future | +| main.rs:2001:9:2001:9 | b | Output | main.rs:1964:5:1964:14 | S1 | +| main.rs:2001:9:2001:15 | await b | | main.rs:1964:5:1964:14 | S1 | +| main.rs:2012:15:2012:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2012:15:2012:19 | SelfParam | &T | main.rs:2011:5:2013:5 | Self [trait Trait1] | +| main.rs:2016:15:2016:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2016:15:2016:19 | SelfParam | &T | main.rs:2015:5:2017:5 | Self [trait Trait2] | +| main.rs:2020:15:2020:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2020:15:2020:19 | SelfParam | &T | main.rs:2006:5:2007:14 | S1 | +| main.rs:2024:15:2024:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2024:15:2024:19 | SelfParam | &T | main.rs:2006:5:2007:14 | S1 | +| main.rs:2027:37:2029:5 | { ... } | | main.rs:2027:16:2027:35 | ImplTraitTypeRepr | +| main.rs:2028:9:2028:10 | S1 | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2028:9:2028:10 | S1 | | main.rs:2027:16:2027:35 | ImplTraitTypeRepr | +| main.rs:2032:18:2032:22 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2032:18:2032:22 | SelfParam | &T | main.rs:2031:5:2033:5 | Self [trait MyTrait] | | main.rs:2036:18:2036:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2036:18:2036:22 | SelfParam | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2036:18:2036:22 | SelfParam | &T | main.rs:2003:5:2003:22 | S3 | -| main.rs:2036:18:2036:22 | SelfParam | &T.T3 | main.rs:2035:10:2035:17 | T | -| main.rs:2036:30:2039:9 | { ... } | | main.rs:2035:10:2035:17 | T | -| main.rs:2037:17:2037:21 | S3(...) | | file://:0:0:0:0 | & | -| main.rs:2037:17:2037:21 | S3(...) | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2037:17:2037:21 | S3(...) | &T | main.rs:2003:5:2003:22 | S3 | -| main.rs:2037:17:2037:21 | S3(...) | &T.T3 | main.rs:2035:10:2035:17 | T | -| main.rs:2037:25:2037:28 | self | | file://:0:0:0:0 | & | -| main.rs:2037:25:2037:28 | self | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2037:25:2037:28 | self | &T | main.rs:2003:5:2003:22 | S3 | -| main.rs:2037:25:2037:28 | self | &T.T3 | main.rs:2035:10:2035:17 | T | -| main.rs:2038:13:2038:21 | t.clone() | | main.rs:2035:10:2035:17 | T | -| main.rs:2042:45:2044:5 | { ... } | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2043:9:2043:10 | S1 | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2043:9:2043:10 | S1 | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2046:41:2046:41 | t | | main.rs:2046:26:2046:38 | B | -| main.rs:2046:52:2048:5 | { ... } | | main.rs:2046:23:2046:23 | A | -| main.rs:2047:9:2047:9 | t | | main.rs:2046:26:2046:38 | B | -| main.rs:2047:9:2047:17 | t.get_a() | | main.rs:2046:23:2046:23 | A | -| main.rs:2050:34:2050:34 | x | | main.rs:2050:24:2050:31 | T | -| main.rs:2050:59:2052:5 | { ... } | | main.rs:2050:43:2050:57 | ImplTraitTypeRepr | -| main.rs:2050:59:2052:5 | { ... } | impl(T) | main.rs:2050:24:2050:31 | T | -| main.rs:2051:9:2051:13 | S3(...) | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2051:9:2051:13 | S3(...) | | main.rs:2050:43:2050:57 | ImplTraitTypeRepr | -| main.rs:2051:9:2051:13 | S3(...) | T3 | main.rs:2050:24:2050:31 | T | -| main.rs:2051:9:2051:13 | S3(...) | impl(T) | main.rs:2050:24:2050:31 | T | -| main.rs:2051:12:2051:12 | x | | main.rs:2050:24:2050:31 | T | -| main.rs:2054:34:2054:34 | x | | main.rs:2054:24:2054:31 | T | -| main.rs:2054:67:2056:5 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:2054:67:2056:5 | { ... } | T | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | -| main.rs:2054:67:2056:5 | { ... } | T.impl(T) | main.rs:2054:24:2054:31 | T | -| main.rs:2055:9:2055:19 | Some(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2055:9:2055:19 | Some(...) | T | main.rs:2003:5:2003:22 | S3 | -| main.rs:2055:9:2055:19 | Some(...) | T | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | -| main.rs:2055:9:2055:19 | Some(...) | T.T3 | main.rs:2054:24:2054:31 | T | -| main.rs:2055:9:2055:19 | Some(...) | T.impl(T) | main.rs:2054:24:2054:31 | T | -| main.rs:2055:14:2055:18 | S3(...) | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2055:14:2055:18 | S3(...) | | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | -| main.rs:2055:14:2055:18 | S3(...) | T3 | main.rs:2054:24:2054:31 | T | -| main.rs:2055:14:2055:18 | S3(...) | impl(T) | main.rs:2054:24:2054:31 | T | -| main.rs:2055:17:2055:17 | x | | main.rs:2054:24:2054:31 | T | -| main.rs:2058:34:2058:34 | x | | main.rs:2058:24:2058:31 | T | -| main.rs:2058:78:2060:5 | { ... } | | file://:0:0:0:0 | (T_2) | -| main.rs:2058:78:2060:5 | { ... } | 0(2) | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | -| main.rs:2058:78:2060:5 | { ... } | 0(2).impl(T) | main.rs:2058:24:2058:31 | T | -| main.rs:2058:78:2060:5 | { ... } | 1(2) | main.rs:2058:61:2058:75 | ImplTraitTypeRepr | -| main.rs:2058:78:2060:5 | { ... } | 1(2).impl(T) | main.rs:2058:24:2058:31 | T | -| main.rs:2059:9:2059:30 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| main.rs:2059:9:2059:30 | TupleExpr | 0(2) | main.rs:2003:5:2003:22 | S3 | -| main.rs:2059:9:2059:30 | TupleExpr | 0(2) | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | -| main.rs:2059:9:2059:30 | TupleExpr | 0(2).T3 | main.rs:2058:24:2058:31 | T | -| main.rs:2059:9:2059:30 | TupleExpr | 0(2).impl(T) | main.rs:2058:24:2058:31 | T | -| main.rs:2059:9:2059:30 | TupleExpr | 1(2) | main.rs:2003:5:2003:22 | S3 | -| main.rs:2059:9:2059:30 | TupleExpr | 1(2) | main.rs:2058:61:2058:75 | ImplTraitTypeRepr | -| main.rs:2059:9:2059:30 | TupleExpr | 1(2).T3 | main.rs:2058:24:2058:31 | T | -| main.rs:2059:9:2059:30 | TupleExpr | 1(2).impl(T) | main.rs:2058:24:2058:31 | T | -| main.rs:2059:10:2059:22 | S3(...) | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2059:10:2059:22 | S3(...) | | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | -| main.rs:2059:10:2059:22 | S3(...) | T3 | main.rs:2058:24:2058:31 | T | -| main.rs:2059:10:2059:22 | S3(...) | impl(T) | main.rs:2058:24:2058:31 | T | -| main.rs:2059:13:2059:13 | x | | main.rs:2058:24:2058:31 | T | -| main.rs:2059:13:2059:21 | x.clone() | | main.rs:2058:24:2058:31 | T | -| main.rs:2059:25:2059:29 | S3(...) | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2059:25:2059:29 | S3(...) | | main.rs:2058:61:2058:75 | ImplTraitTypeRepr | -| main.rs:2059:25:2059:29 | S3(...) | T3 | main.rs:2058:24:2058:31 | T | -| main.rs:2059:25:2059:29 | S3(...) | impl(T) | main.rs:2058:24:2058:31 | T | -| main.rs:2059:28:2059:28 | x | | main.rs:2058:24:2058:31 | T | -| main.rs:2062:26:2062:26 | t | | main.rs:2062:29:2062:43 | ImplTraitTypeRepr | -| main.rs:2062:51:2064:5 | { ... } | | main.rs:2062:23:2062:23 | A | -| main.rs:2063:9:2063:9 | t | | main.rs:2062:29:2062:43 | ImplTraitTypeRepr | -| main.rs:2063:9:2063:17 | t.get_a() | | main.rs:2062:23:2062:23 | A | -| main.rs:2067:13:2067:13 | x | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2067:17:2067:20 | f1(...) | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2068:9:2068:9 | x | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2069:9:2069:9 | x | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2070:13:2070:13 | a | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2070:17:2070:32 | get_a_my_trait(...) | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2071:13:2071:13 | b | | main.rs:2002:5:2002:14 | S2 | -| main.rs:2071:17:2071:33 | uses_my_trait1(...) | | main.rs:2002:5:2002:14 | S2 | -| main.rs:2071:32:2071:32 | a | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2072:13:2072:13 | a | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2072:17:2072:32 | get_a_my_trait(...) | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2073:13:2073:13 | c | | main.rs:2002:5:2002:14 | S2 | -| main.rs:2073:17:2073:33 | uses_my_trait2(...) | | main.rs:2002:5:2002:14 | S2 | -| main.rs:2073:32:2073:32 | a | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2074:13:2074:13 | d | | main.rs:2002:5:2002:14 | S2 | -| main.rs:2074:17:2074:34 | uses_my_trait2(...) | | main.rs:2002:5:2002:14 | S2 | -| main.rs:2074:32:2074:33 | S1 | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2075:13:2075:13 | e | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2075:17:2075:35 | get_a_my_trait2(...) | | main.rs:2050:43:2050:57 | ImplTraitTypeRepr | -| main.rs:2075:17:2075:35 | get_a_my_trait2(...) | impl(T) | main.rs:2000:5:2001:14 | S1 | -| main.rs:2075:17:2075:43 | ... .get_a() | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2075:33:2075:34 | S1 | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2078:13:2078:13 | f | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2078:17:2078:35 | get_a_my_trait3(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2078:17:2078:35 | get_a_my_trait3(...) | T | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | -| main.rs:2078:17:2078:35 | get_a_my_trait3(...) | T.impl(T) | main.rs:2000:5:2001:14 | S1 | -| main.rs:2078:17:2078:44 | ... .unwrap() | | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | -| main.rs:2078:17:2078:44 | ... .unwrap() | impl(T) | main.rs:2000:5:2001:14 | S1 | -| main.rs:2078:17:2078:52 | ... .get_a() | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2078:33:2078:34 | S1 | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2079:13:2079:13 | g | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2079:17:2079:35 | get_a_my_trait4(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 0(2) | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | -| main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 0(2).impl(T) | main.rs:2000:5:2001:14 | S1 | -| main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 1(2) | main.rs:2058:61:2058:75 | ImplTraitTypeRepr | -| main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 1(2).impl(T) | main.rs:2000:5:2001:14 | S1 | -| main.rs:2079:17:2079:37 | ... .0 | | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | -| main.rs:2079:17:2079:37 | ... .0 | impl(T) | main.rs:2000:5:2001:14 | S1 | -| main.rs:2079:17:2079:45 | ... .get_a() | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2079:33:2079:34 | S1 | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2090:16:2090:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2090:16:2090:20 | SelfParam | &T | main.rs:2086:5:2087:13 | S | -| main.rs:2090:31:2092:9 | { ... } | | main.rs:2086:5:2087:13 | S | -| main.rs:2091:13:2091:13 | S | | main.rs:2086:5:2087:13 | S | -| main.rs:2101:26:2103:9 | { ... } | | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2101:26:2103:9 | { ... } | T | main.rs:2100:10:2100:10 | T | -| main.rs:2102:13:2102:38 | MyVec {...} | | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2102:13:2102:38 | MyVec {...} | T | main.rs:2100:10:2100:10 | T | -| main.rs:2102:27:2102:36 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2102:27:2102:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2102:27:2102:36 | ...::new(...) | T | main.rs:2100:10:2100:10 | T | -| main.rs:2105:17:2105:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2105:17:2105:25 | SelfParam | &T | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2105:17:2105:25 | SelfParam | &T.T | main.rs:2100:10:2100:10 | T | -| main.rs:2105:28:2105:32 | value | | main.rs:2100:10:2100:10 | T | -| main.rs:2106:13:2106:16 | self | | file://:0:0:0:0 | & | -| main.rs:2106:13:2106:16 | self | &T | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2106:13:2106:16 | self | &T.T | main.rs:2100:10:2100:10 | T | -| main.rs:2106:13:2106:21 | self.data | | {EXTERNAL LOCATION} | Vec | -| main.rs:2106:13:2106:21 | self.data | A | {EXTERNAL LOCATION} | Global | -| main.rs:2106:13:2106:21 | self.data | T | main.rs:2100:10:2100:10 | T | -| main.rs:2106:28:2106:32 | value | | main.rs:2100:10:2100:10 | T | -| main.rs:2114:18:2114:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2114:18:2114:22 | SelfParam | &T | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2114:18:2114:22 | SelfParam | &T.T | main.rs:2110:10:2110:10 | T | -| main.rs:2114:25:2114:29 | index | | {EXTERNAL LOCATION} | usize | -| main.rs:2114:56:2116:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:2114:56:2116:9 | { ... } | &T | main.rs:2110:10:2110:10 | T | -| main.rs:2115:13:2115:29 | &... | | file://:0:0:0:0 | & | -| main.rs:2115:13:2115:29 | &... | &T | main.rs:2110:10:2110:10 | T | -| main.rs:2115:14:2115:17 | self | | file://:0:0:0:0 | & | -| main.rs:2115:14:2115:17 | self | &T | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2115:14:2115:17 | self | &T.T | main.rs:2110:10:2110:10 | T | -| main.rs:2115:14:2115:22 | self.data | | {EXTERNAL LOCATION} | Vec | -| main.rs:2115:14:2115:22 | self.data | A | {EXTERNAL LOCATION} | Global | -| main.rs:2115:14:2115:22 | self.data | T | main.rs:2110:10:2110:10 | T | -| main.rs:2115:14:2115:29 | ...[index] | | main.rs:2110:10:2110:10 | T | -| main.rs:2115:24:2115:28 | index | | {EXTERNAL LOCATION} | usize | -| main.rs:2119:22:2119:26 | slice | | file://:0:0:0:0 | & | -| main.rs:2119:22:2119:26 | slice | &T | file://:0:0:0:0 | [] | -| main.rs:2119:22:2119:26 | slice | &T.[T] | main.rs:2086:5:2087:13 | S | -| main.rs:2120:13:2120:13 | x | | main.rs:2086:5:2087:13 | S | -| main.rs:2120:17:2120:21 | slice | | file://:0:0:0:0 | & | -| main.rs:2120:17:2120:21 | slice | &T | file://:0:0:0:0 | [] | -| main.rs:2120:17:2120:21 | slice | &T.[T] | main.rs:2086:5:2087:13 | S | -| main.rs:2120:17:2120:24 | slice[0] | | main.rs:2086:5:2087:13 | S | -| main.rs:2120:17:2120:30 | ... .foo() | | main.rs:2086:5:2087:13 | S | -| main.rs:2120:23:2120:23 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2124:17:2124:19 | vec | | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2124:17:2124:19 | vec | T | main.rs:2086:5:2087:13 | S | -| main.rs:2124:23:2124:34 | ...::new(...) | | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2124:23:2124:34 | ...::new(...) | T | main.rs:2086:5:2087:13 | S | -| main.rs:2125:9:2125:11 | vec | | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2125:9:2125:11 | vec | T | main.rs:2086:5:2087:13 | S | -| main.rs:2125:18:2125:18 | S | | main.rs:2086:5:2087:13 | S | -| main.rs:2126:9:2126:11 | vec | | main.rs:2095:5:2098:5 | MyVec | -| main.rs:2126:9:2126:11 | vec | T | main.rs:2086:5:2087:13 | S | -| main.rs:2126:9:2126:14 | vec[0] | | main.rs:2086:5:2087:13 | S | -| main.rs:2126:9:2126:20 | ... .foo() | | main.rs:2086:5:2087:13 | S | -| main.rs:2126:13:2126:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2126:13:2126:13 | 0 | | {EXTERNAL LOCATION} | usize | -| main.rs:2128:13:2128:14 | xs | | file://:0:0:0:0 | [] | -| main.rs:2128:13:2128:14 | xs | [T;...] | main.rs:2086:5:2087:13 | S | -| main.rs:2128:21:2128:21 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2128:26:2128:28 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2128:26:2128:28 | [...] | [T;...] | main.rs:2086:5:2087:13 | S | -| main.rs:2128:27:2128:27 | S | | main.rs:2086:5:2087:13 | S | -| main.rs:2129:13:2129:13 | x | | main.rs:2086:5:2087:13 | S | -| main.rs:2129:17:2129:18 | xs | | file://:0:0:0:0 | [] | -| main.rs:2129:17:2129:18 | xs | [T;...] | main.rs:2086:5:2087:13 | S | -| main.rs:2129:17:2129:21 | xs[0] | | main.rs:2086:5:2087:13 | S | -| main.rs:2129:17:2129:27 | ... .foo() | | main.rs:2086:5:2087:13 | S | -| main.rs:2129:20:2129:20 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2131:23:2131:25 | &xs | | file://:0:0:0:0 | & | -| main.rs:2131:23:2131:25 | &xs | &T | file://:0:0:0:0 | [] | -| main.rs:2131:23:2131:25 | &xs | &T | file://:0:0:0:0 | [] | -| main.rs:2131:23:2131:25 | &xs | &T.[T;...] | main.rs:2086:5:2087:13 | S | -| main.rs:2131:23:2131:25 | &xs | &T.[T] | main.rs:2086:5:2087:13 | S | -| main.rs:2131:24:2131:25 | xs | | file://:0:0:0:0 | [] | -| main.rs:2131:24:2131:25 | xs | [T;...] | main.rs:2086:5:2087:13 | S | -| main.rs:2137:13:2137:13 | x | | {EXTERNAL LOCATION} | String | -| main.rs:2137:17:2137:46 | MacroExpr | | {EXTERNAL LOCATION} | String | -| main.rs:2137:25:2137:35 | "Hello, {}" | | file://:0:0:0:0 | & | -| main.rs:2137:25:2137:35 | "Hello, {}" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2137:25:2137:45 | ...::format(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2137:25:2137:45 | ...::must_use(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2137:25:2137:45 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2137:25:2137:45 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2137:25:2137:45 | { ... } | | {EXTERNAL LOCATION} | String | -| main.rs:2137:38:2137:45 | "World!" | | file://:0:0:0:0 | & | -| main.rs:2137:38:2137:45 | "World!" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2146:19:2146:22 | SelfParam | | main.rs:2142:5:2147:5 | Self [trait MyAdd] | -| main.rs:2146:25:2146:27 | rhs | | main.rs:2142:17:2142:26 | Rhs | -| main.rs:2153:19:2153:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | -| main.rs:2153:25:2153:29 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2153:45:2155:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2154:13:2154:17 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2162:19:2162:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | -| main.rs:2162:25:2162:29 | value | | file://:0:0:0:0 | & | -| main.rs:2162:25:2162:29 | value | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2162:46:2164:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2163:13:2163:18 | * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2163:14:2163:18 | value | | file://:0:0:0:0 | & | -| main.rs:2163:14:2163:18 | value | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2171:19:2171:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | -| main.rs:2171:25:2171:29 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2171:46:2177:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2172:13:2176:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2172:13:2176:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | -| main.rs:2172:16:2172:20 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2172:22:2174:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2172:22:2174:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2173:17:2173:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2173:17:2173:17 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2174:20:2176:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2174:20:2176:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2175:17:2175:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2175:17:2175:17 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2186:19:2186:22 | SelfParam | | main.rs:2180:5:2180:19 | S | -| main.rs:2186:19:2186:22 | SelfParam | T | main.rs:2182:10:2182:17 | T | -| main.rs:2186:25:2186:29 | other | | main.rs:2180:5:2180:19 | S | -| main.rs:2186:25:2186:29 | other | T | main.rs:2182:10:2182:17 | T | -| main.rs:2186:54:2188:9 | { ... } | | main.rs:2180:5:2180:19 | S | -| main.rs:2186:54:2188:9 | { ... } | T | main.rs:2143:9:2143:20 | Output | -| main.rs:2187:13:2187:39 | S(...) | | main.rs:2180:5:2180:19 | S | -| main.rs:2187:13:2187:39 | S(...) | T | main.rs:2143:9:2143:20 | Output | -| main.rs:2187:15:2187:22 | (...) | | main.rs:2182:10:2182:17 | T | -| main.rs:2187:15:2187:38 | ... .my_add(...) | | main.rs:2143:9:2143:20 | Output | -| main.rs:2187:16:2187:19 | self | | main.rs:2180:5:2180:19 | S | -| main.rs:2187:16:2187:19 | self | T | main.rs:2182:10:2182:17 | T | -| main.rs:2187:16:2187:21 | self.0 | | main.rs:2182:10:2182:17 | T | -| main.rs:2187:31:2187:35 | other | | main.rs:2180:5:2180:19 | S | -| main.rs:2187:31:2187:35 | other | T | main.rs:2182:10:2182:17 | T | -| main.rs:2187:31:2187:37 | other.0 | | main.rs:2142:5:2147:5 | Self [trait MyAdd] | -| main.rs:2187:31:2187:37 | other.0 | | main.rs:2182:10:2182:17 | T | -| main.rs:2195:19:2195:22 | SelfParam | | main.rs:2180:5:2180:19 | S | -| main.rs:2195:19:2195:22 | SelfParam | T | main.rs:2191:10:2191:17 | T | -| main.rs:2195:25:2195:29 | other | | main.rs:2191:10:2191:17 | T | -| main.rs:2195:51:2197:9 | { ... } | | main.rs:2180:5:2180:19 | S | -| main.rs:2195:51:2197:9 | { ... } | T | main.rs:2143:9:2143:20 | Output | -| main.rs:2196:13:2196:37 | S(...) | | main.rs:2180:5:2180:19 | S | -| main.rs:2196:13:2196:37 | S(...) | T | main.rs:2143:9:2143:20 | Output | -| main.rs:2196:15:2196:22 | (...) | | main.rs:2191:10:2191:17 | T | -| main.rs:2196:15:2196:36 | ... .my_add(...) | | main.rs:2143:9:2143:20 | Output | -| main.rs:2196:16:2196:19 | self | | main.rs:2180:5:2180:19 | S | -| main.rs:2196:16:2196:19 | self | T | main.rs:2191:10:2191:17 | T | -| main.rs:2196:16:2196:21 | self.0 | | main.rs:2191:10:2191:17 | T | -| main.rs:2196:31:2196:35 | other | | main.rs:2191:10:2191:17 | T | -| main.rs:2207:19:2207:22 | SelfParam | | main.rs:2180:5:2180:19 | S | -| main.rs:2207:19:2207:22 | SelfParam | T | main.rs:2200:14:2200:14 | T | -| main.rs:2207:25:2207:29 | other | | file://:0:0:0:0 | & | -| main.rs:2207:25:2207:29 | other | &T | main.rs:2200:14:2200:14 | T | -| main.rs:2207:55:2209:9 | { ... } | | main.rs:2180:5:2180:19 | S | -| main.rs:2208:13:2208:37 | S(...) | | main.rs:2180:5:2180:19 | S | -| main.rs:2208:15:2208:22 | (...) | | main.rs:2200:14:2200:14 | T | -| main.rs:2208:16:2208:19 | self | | main.rs:2180:5:2180:19 | S | -| main.rs:2208:16:2208:19 | self | T | main.rs:2200:14:2200:14 | T | -| main.rs:2208:16:2208:21 | self.0 | | main.rs:2200:14:2200:14 | T | -| main.rs:2208:31:2208:35 | other | | file://:0:0:0:0 | & | -| main.rs:2208:31:2208:35 | other | &T | main.rs:2200:14:2200:14 | T | -| main.rs:2214:20:2214:24 | value | | main.rs:2212:18:2212:18 | T | -| main.rs:2219:20:2219:24 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2219:40:2221:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2220:13:2220:17 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2226:20:2226:24 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2226:41:2232:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2227:13:2231:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2227:13:2231:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | -| main.rs:2227:16:2227:20 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2227:22:2229:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2227:22:2229:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2228:17:2228:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2228:17:2228:17 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2229:20:2231:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2229:20:2231:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2230:17:2230:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2230:17:2230:17 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2237:21:2237:25 | value | | main.rs:2235:19:2235:19 | T | -| main.rs:2237:31:2237:31 | x | | main.rs:2235:5:2238:5 | Self [trait MyFrom2] | -| main.rs:2242:21:2242:25 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2242:33:2242:33 | _ | | {EXTERNAL LOCATION} | i64 | -| main.rs:2242:48:2244:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2243:13:2243:17 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2249:21:2249:25 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2249:34:2249:34 | _ | | {EXTERNAL LOCATION} | i64 | -| main.rs:2249:49:2255:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2250:13:2254:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2250:16:2250:20 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2250:22:2252:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2251:17:2251:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2252:20:2254:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2253:17:2253:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2260:15:2260:15 | x | | main.rs:2258:5:2264:5 | Self [trait MySelfTrait] | -| main.rs:2263:15:2263:15 | x | | main.rs:2258:5:2264:5 | Self [trait MySelfTrait] | -| main.rs:2268:15:2268:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2268:31:2270:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2269:13:2269:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2269:13:2269:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2269:17:2269:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2273:15:2273:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2273:32:2275:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2274:13:2274:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2274:13:2274:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2274:17:2274:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2280:15:2280:15 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2280:31:2282:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2281:13:2281:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2281:13:2281:13 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2285:15:2285:15 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2285:32:2287:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:2286:13:2286:13 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2291:13:2291:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2291:22:2291:23 | 73 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2291:22:2291:23 | 73 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2292:9:2292:9 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2292:9:2292:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2292:18:2292:21 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2293:9:2293:9 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2293:9:2293:23 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2293:18:2293:22 | &5i64 | | file://:0:0:0:0 | & | -| main.rs:2293:18:2293:22 | &5i64 | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2293:19:2293:22 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2294:9:2294:9 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2294:9:2294:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2294:18:2294:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2296:9:2296:15 | S(...) | | main.rs:2180:5:2180:19 | S | -| main.rs:2296:9:2296:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2296:9:2296:31 | ... .my_add(...) | | main.rs:2180:5:2180:19 | S | -| main.rs:2296:11:2296:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2296:24:2296:30 | S(...) | | main.rs:2180:5:2180:19 | S | -| main.rs:2296:24:2296:30 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2296:26:2296:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2297:9:2297:15 | S(...) | | main.rs:2180:5:2180:19 | S | -| main.rs:2297:9:2297:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2297:11:2297:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2297:24:2297:27 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2298:9:2298:15 | S(...) | | main.rs:2180:5:2180:19 | S | -| main.rs:2298:9:2298:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2298:9:2298:29 | ... .my_add(...) | | main.rs:2180:5:2180:19 | S | -| main.rs:2298:11:2298:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2298:24:2298:28 | &3i64 | | file://:0:0:0:0 | & | -| main.rs:2298:24:2298:28 | &3i64 | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2298:25:2298:28 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2300:13:2300:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2300:17:2300:35 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2300:30:2300:34 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2301:13:2301:13 | y | | {EXTERNAL LOCATION} | i64 | -| main.rs:2301:17:2301:34 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2301:30:2301:33 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2302:13:2302:13 | z | | {EXTERNAL LOCATION} | i64 | -| main.rs:2302:22:2302:43 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2302:38:2302:42 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2303:9:2303:34 | ...::my_from2(...) | | file://:0:0:0:0 | () | -| main.rs:2303:23:2303:27 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2303:30:2303:33 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2304:9:2304:33 | ...::my_from2(...) | | file://:0:0:0:0 | () | -| main.rs:2304:23:2304:26 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2304:29:2304:32 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2305:9:2305:38 | ...::my_from2(...) | | file://:0:0:0:0 | () | -| main.rs:2305:27:2305:31 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2305:34:2305:37 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2307:9:2307:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2307:17:2307:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2308:9:2308:22 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2308:17:2308:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2309:9:2309:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2036:18:2036:22 | SelfParam | &T | main.rs:2006:5:2007:14 | S1 | +| main.rs:2036:31:2038:9 | { ... } | | main.rs:2008:5:2008:14 | S2 | +| main.rs:2037:13:2037:14 | S2 | | main.rs:2008:5:2008:14 | S2 | +| main.rs:2042:18:2042:22 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2042:18:2042:22 | SelfParam | | main.rs:2009:5:2009:22 | S3 | +| main.rs:2042:18:2042:22 | SelfParam | &T | main.rs:2009:5:2009:22 | S3 | +| main.rs:2042:18:2042:22 | SelfParam | &T.T3 | main.rs:2041:10:2041:17 | T | +| main.rs:2042:30:2045:9 | { ... } | | main.rs:2041:10:2041:17 | T | +| main.rs:2043:17:2043:21 | S3(...) | | file://:0:0:0:0 | & | +| main.rs:2043:17:2043:21 | S3(...) | | main.rs:2009:5:2009:22 | S3 | +| main.rs:2043:17:2043:21 | S3(...) | &T | main.rs:2009:5:2009:22 | S3 | +| main.rs:2043:17:2043:21 | S3(...) | &T.T3 | main.rs:2041:10:2041:17 | T | +| main.rs:2043:25:2043:28 | self | | file://:0:0:0:0 | & | +| main.rs:2043:25:2043:28 | self | | main.rs:2009:5:2009:22 | S3 | +| main.rs:2043:25:2043:28 | self | &T | main.rs:2009:5:2009:22 | S3 | +| main.rs:2043:25:2043:28 | self | &T.T3 | main.rs:2041:10:2041:17 | T | +| main.rs:2044:13:2044:21 | t.clone() | | main.rs:2041:10:2041:17 | T | +| main.rs:2048:45:2050:5 | { ... } | | main.rs:2048:28:2048:43 | ImplTraitTypeRepr | +| main.rs:2049:9:2049:10 | S1 | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2049:9:2049:10 | S1 | | main.rs:2048:28:2048:43 | ImplTraitTypeRepr | +| main.rs:2052:41:2052:41 | t | | main.rs:2052:26:2052:38 | B | +| main.rs:2052:52:2054:5 | { ... } | | main.rs:2052:23:2052:23 | A | +| main.rs:2053:9:2053:9 | t | | main.rs:2052:26:2052:38 | B | +| main.rs:2053:9:2053:17 | t.get_a() | | main.rs:2052:23:2052:23 | A | +| main.rs:2056:34:2056:34 | x | | main.rs:2056:24:2056:31 | T | +| main.rs:2056:59:2058:5 | { ... } | | main.rs:2056:43:2056:57 | ImplTraitTypeRepr | +| main.rs:2056:59:2058:5 | { ... } | impl(T) | main.rs:2056:24:2056:31 | T | +| main.rs:2057:9:2057:13 | S3(...) | | main.rs:2009:5:2009:22 | S3 | +| main.rs:2057:9:2057:13 | S3(...) | | main.rs:2056:43:2056:57 | ImplTraitTypeRepr | +| main.rs:2057:9:2057:13 | S3(...) | T3 | main.rs:2056:24:2056:31 | T | +| main.rs:2057:9:2057:13 | S3(...) | impl(T) | main.rs:2056:24:2056:31 | T | +| main.rs:2057:12:2057:12 | x | | main.rs:2056:24:2056:31 | T | +| main.rs:2060:34:2060:34 | x | | main.rs:2060:24:2060:31 | T | +| main.rs:2060:67:2062:5 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2060:67:2062:5 | { ... } | T | main.rs:2060:50:2060:64 | ImplTraitTypeRepr | +| main.rs:2060:67:2062:5 | { ... } | T.impl(T) | main.rs:2060:24:2060:31 | T | +| main.rs:2061:9:2061:19 | Some(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2061:9:2061:19 | Some(...) | T | main.rs:2009:5:2009:22 | S3 | +| main.rs:2061:9:2061:19 | Some(...) | T | main.rs:2060:50:2060:64 | ImplTraitTypeRepr | +| main.rs:2061:9:2061:19 | Some(...) | T.T3 | main.rs:2060:24:2060:31 | T | +| main.rs:2061:9:2061:19 | Some(...) | T.impl(T) | main.rs:2060:24:2060:31 | T | +| main.rs:2061:14:2061:18 | S3(...) | | main.rs:2009:5:2009:22 | S3 | +| main.rs:2061:14:2061:18 | S3(...) | | main.rs:2060:50:2060:64 | ImplTraitTypeRepr | +| main.rs:2061:14:2061:18 | S3(...) | T3 | main.rs:2060:24:2060:31 | T | +| main.rs:2061:14:2061:18 | S3(...) | impl(T) | main.rs:2060:24:2060:31 | T | +| main.rs:2061:17:2061:17 | x | | main.rs:2060:24:2060:31 | T | +| main.rs:2064:34:2064:34 | x | | main.rs:2064:24:2064:31 | T | +| main.rs:2064:78:2066:5 | { ... } | | file://:0:0:0:0 | (T_2) | +| main.rs:2064:78:2066:5 | { ... } | 0(2) | main.rs:2064:44:2064:58 | ImplTraitTypeRepr | +| main.rs:2064:78:2066:5 | { ... } | 0(2).impl(T) | main.rs:2064:24:2064:31 | T | +| main.rs:2064:78:2066:5 | { ... } | 1(2) | main.rs:2064:61:2064:75 | ImplTraitTypeRepr | +| main.rs:2064:78:2066:5 | { ... } | 1(2).impl(T) | main.rs:2064:24:2064:31 | T | +| main.rs:2065:9:2065:30 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| main.rs:2065:9:2065:30 | TupleExpr | 0(2) | main.rs:2009:5:2009:22 | S3 | +| main.rs:2065:9:2065:30 | TupleExpr | 0(2) | main.rs:2064:44:2064:58 | ImplTraitTypeRepr | +| main.rs:2065:9:2065:30 | TupleExpr | 0(2).T3 | main.rs:2064:24:2064:31 | T | +| main.rs:2065:9:2065:30 | TupleExpr | 0(2).impl(T) | main.rs:2064:24:2064:31 | T | +| main.rs:2065:9:2065:30 | TupleExpr | 1(2) | main.rs:2009:5:2009:22 | S3 | +| main.rs:2065:9:2065:30 | TupleExpr | 1(2) | main.rs:2064:61:2064:75 | ImplTraitTypeRepr | +| main.rs:2065:9:2065:30 | TupleExpr | 1(2).T3 | main.rs:2064:24:2064:31 | T | +| main.rs:2065:9:2065:30 | TupleExpr | 1(2).impl(T) | main.rs:2064:24:2064:31 | T | +| main.rs:2065:10:2065:22 | S3(...) | | main.rs:2009:5:2009:22 | S3 | +| main.rs:2065:10:2065:22 | S3(...) | | main.rs:2064:44:2064:58 | ImplTraitTypeRepr | +| main.rs:2065:10:2065:22 | S3(...) | T3 | main.rs:2064:24:2064:31 | T | +| main.rs:2065:10:2065:22 | S3(...) | impl(T) | main.rs:2064:24:2064:31 | T | +| main.rs:2065:13:2065:13 | x | | main.rs:2064:24:2064:31 | T | +| main.rs:2065:13:2065:21 | x.clone() | | main.rs:2064:24:2064:31 | T | +| main.rs:2065:25:2065:29 | S3(...) | | main.rs:2009:5:2009:22 | S3 | +| main.rs:2065:25:2065:29 | S3(...) | | main.rs:2064:61:2064:75 | ImplTraitTypeRepr | +| main.rs:2065:25:2065:29 | S3(...) | T3 | main.rs:2064:24:2064:31 | T | +| main.rs:2065:25:2065:29 | S3(...) | impl(T) | main.rs:2064:24:2064:31 | T | +| main.rs:2065:28:2065:28 | x | | main.rs:2064:24:2064:31 | T | +| main.rs:2068:26:2068:26 | t | | main.rs:2068:29:2068:43 | ImplTraitTypeRepr | +| main.rs:2068:51:2070:5 | { ... } | | main.rs:2068:23:2068:23 | A | +| main.rs:2069:9:2069:9 | t | | main.rs:2068:29:2068:43 | ImplTraitTypeRepr | +| main.rs:2069:9:2069:17 | t.get_a() | | main.rs:2068:23:2068:23 | A | +| main.rs:2073:13:2073:13 | x | | main.rs:2027:16:2027:35 | ImplTraitTypeRepr | +| main.rs:2073:17:2073:20 | f1(...) | | main.rs:2027:16:2027:35 | ImplTraitTypeRepr | +| main.rs:2074:9:2074:9 | x | | main.rs:2027:16:2027:35 | ImplTraitTypeRepr | +| main.rs:2075:9:2075:9 | x | | main.rs:2027:16:2027:35 | ImplTraitTypeRepr | +| main.rs:2076:13:2076:13 | a | | main.rs:2048:28:2048:43 | ImplTraitTypeRepr | +| main.rs:2076:17:2076:32 | get_a_my_trait(...) | | main.rs:2048:28:2048:43 | ImplTraitTypeRepr | +| main.rs:2077:13:2077:13 | b | | main.rs:2008:5:2008:14 | S2 | +| main.rs:2077:17:2077:33 | uses_my_trait1(...) | | main.rs:2008:5:2008:14 | S2 | +| main.rs:2077:32:2077:32 | a | | main.rs:2048:28:2048:43 | ImplTraitTypeRepr | +| main.rs:2078:13:2078:13 | a | | main.rs:2048:28:2048:43 | ImplTraitTypeRepr | +| main.rs:2078:17:2078:32 | get_a_my_trait(...) | | main.rs:2048:28:2048:43 | ImplTraitTypeRepr | +| main.rs:2079:13:2079:13 | c | | main.rs:2008:5:2008:14 | S2 | +| main.rs:2079:17:2079:33 | uses_my_trait2(...) | | main.rs:2008:5:2008:14 | S2 | +| main.rs:2079:32:2079:32 | a | | main.rs:2048:28:2048:43 | ImplTraitTypeRepr | +| main.rs:2080:13:2080:13 | d | | main.rs:2008:5:2008:14 | S2 | +| main.rs:2080:17:2080:34 | uses_my_trait2(...) | | main.rs:2008:5:2008:14 | S2 | +| main.rs:2080:32:2080:33 | S1 | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2081:13:2081:13 | e | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2081:17:2081:35 | get_a_my_trait2(...) | | main.rs:2056:43:2056:57 | ImplTraitTypeRepr | +| main.rs:2081:17:2081:35 | get_a_my_trait2(...) | impl(T) | main.rs:2006:5:2007:14 | S1 | +| main.rs:2081:17:2081:43 | ... .get_a() | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2081:33:2081:34 | S1 | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2084:13:2084:13 | f | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2084:17:2084:35 | get_a_my_trait3(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2084:17:2084:35 | get_a_my_trait3(...) | T | main.rs:2060:50:2060:64 | ImplTraitTypeRepr | +| main.rs:2084:17:2084:35 | get_a_my_trait3(...) | T.impl(T) | main.rs:2006:5:2007:14 | S1 | +| main.rs:2084:17:2084:44 | ... .unwrap() | | main.rs:2060:50:2060:64 | ImplTraitTypeRepr | +| main.rs:2084:17:2084:44 | ... .unwrap() | impl(T) | main.rs:2006:5:2007:14 | S1 | +| main.rs:2084:17:2084:52 | ... .get_a() | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2084:33:2084:34 | S1 | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2085:13:2085:13 | g | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2085:17:2085:35 | get_a_my_trait4(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2085:17:2085:35 | get_a_my_trait4(...) | 0(2) | main.rs:2064:44:2064:58 | ImplTraitTypeRepr | +| main.rs:2085:17:2085:35 | get_a_my_trait4(...) | 0(2).impl(T) | main.rs:2006:5:2007:14 | S1 | +| main.rs:2085:17:2085:35 | get_a_my_trait4(...) | 1(2) | main.rs:2064:61:2064:75 | ImplTraitTypeRepr | +| main.rs:2085:17:2085:35 | get_a_my_trait4(...) | 1(2).impl(T) | main.rs:2006:5:2007:14 | S1 | +| main.rs:2085:17:2085:37 | ... .0 | | main.rs:2064:44:2064:58 | ImplTraitTypeRepr | +| main.rs:2085:17:2085:37 | ... .0 | impl(T) | main.rs:2006:5:2007:14 | S1 | +| main.rs:2085:17:2085:45 | ... .get_a() | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2085:33:2085:34 | S1 | | main.rs:2006:5:2007:14 | S1 | +| main.rs:2096:16:2096:20 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2096:16:2096:20 | SelfParam | &T | main.rs:2092:5:2093:13 | S | +| main.rs:2096:31:2098:9 | { ... } | | main.rs:2092:5:2093:13 | S | +| main.rs:2097:13:2097:13 | S | | main.rs:2092:5:2093:13 | S | +| main.rs:2107:26:2109:9 | { ... } | | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2107:26:2109:9 | { ... } | T | main.rs:2106:10:2106:10 | T | +| main.rs:2108:13:2108:38 | MyVec {...} | | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2108:13:2108:38 | MyVec {...} | T | main.rs:2106:10:2106:10 | T | +| main.rs:2108:27:2108:36 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2108:27:2108:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2108:27:2108:36 | ...::new(...) | T | main.rs:2106:10:2106:10 | T | +| main.rs:2111:17:2111:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2111:17:2111:25 | SelfParam | &T | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2111:17:2111:25 | SelfParam | &T.T | main.rs:2106:10:2106:10 | T | +| main.rs:2111:28:2111:32 | value | | main.rs:2106:10:2106:10 | T | +| main.rs:2112:13:2112:16 | self | | file://:0:0:0:0 | & | +| main.rs:2112:13:2112:16 | self | &T | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2112:13:2112:16 | self | &T.T | main.rs:2106:10:2106:10 | T | +| main.rs:2112:13:2112:21 | self.data | | {EXTERNAL LOCATION} | Vec | +| main.rs:2112:13:2112:21 | self.data | A | {EXTERNAL LOCATION} | Global | +| main.rs:2112:13:2112:21 | self.data | T | main.rs:2106:10:2106:10 | T | +| main.rs:2112:28:2112:32 | value | | main.rs:2106:10:2106:10 | T | +| main.rs:2120:18:2120:22 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2120:18:2120:22 | SelfParam | &T | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2120:18:2120:22 | SelfParam | &T.T | main.rs:2116:10:2116:10 | T | +| main.rs:2120:25:2120:29 | index | | {EXTERNAL LOCATION} | usize | +| main.rs:2120:56:2122:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:2120:56:2122:9 | { ... } | &T | main.rs:2116:10:2116:10 | T | +| main.rs:2121:13:2121:29 | &... | | file://:0:0:0:0 | & | +| main.rs:2121:13:2121:29 | &... | &T | main.rs:2116:10:2116:10 | T | +| main.rs:2121:14:2121:17 | self | | file://:0:0:0:0 | & | +| main.rs:2121:14:2121:17 | self | &T | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2121:14:2121:17 | self | &T.T | main.rs:2116:10:2116:10 | T | +| main.rs:2121:14:2121:22 | self.data | | {EXTERNAL LOCATION} | Vec | +| main.rs:2121:14:2121:22 | self.data | A | {EXTERNAL LOCATION} | Global | +| main.rs:2121:14:2121:22 | self.data | T | main.rs:2116:10:2116:10 | T | +| main.rs:2121:14:2121:29 | ...[index] | | main.rs:2116:10:2116:10 | T | +| main.rs:2121:24:2121:28 | index | | {EXTERNAL LOCATION} | usize | +| main.rs:2125:22:2125:26 | slice | | file://:0:0:0:0 | & | +| main.rs:2125:22:2125:26 | slice | &T | file://:0:0:0:0 | [] | +| main.rs:2125:22:2125:26 | slice | &T.[T] | main.rs:2092:5:2093:13 | S | +| main.rs:2126:13:2126:13 | x | | main.rs:2092:5:2093:13 | S | +| main.rs:2126:17:2126:21 | slice | | file://:0:0:0:0 | & | +| main.rs:2126:17:2126:21 | slice | &T | file://:0:0:0:0 | [] | +| main.rs:2126:17:2126:21 | slice | &T.[T] | main.rs:2092:5:2093:13 | S | +| main.rs:2126:17:2126:24 | slice[0] | | main.rs:2092:5:2093:13 | S | +| main.rs:2126:17:2126:30 | ... .foo() | | main.rs:2092:5:2093:13 | S | +| main.rs:2126:23:2126:23 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2129:37:2129:37 | a | | main.rs:2129:20:2129:34 | T | +| main.rs:2129:43:2129:43 | b | | {EXTERNAL LOCATION} | usize | +| main.rs:2132:5:2134:5 | { ... } | | {EXTERNAL LOCATION} | Output | +| main.rs:2133:9:2133:9 | a | | main.rs:2129:20:2129:34 | T | +| main.rs:2133:9:2133:12 | a[b] | | {EXTERNAL LOCATION} | Output | +| main.rs:2133:11:2133:11 | b | | {EXTERNAL LOCATION} | usize | +| main.rs:2137:17:2137:19 | vec | | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2137:17:2137:19 | vec | T | main.rs:2092:5:2093:13 | S | +| main.rs:2137:23:2137:34 | ...::new(...) | | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2137:23:2137:34 | ...::new(...) | T | main.rs:2092:5:2093:13 | S | +| main.rs:2138:9:2138:11 | vec | | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2138:9:2138:11 | vec | T | main.rs:2092:5:2093:13 | S | +| main.rs:2138:18:2138:18 | S | | main.rs:2092:5:2093:13 | S | +| main.rs:2139:9:2139:11 | vec | | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2139:9:2139:11 | vec | T | main.rs:2092:5:2093:13 | S | +| main.rs:2139:9:2139:14 | vec[0] | | main.rs:2092:5:2093:13 | S | +| main.rs:2139:9:2139:20 | ... .foo() | | main.rs:2092:5:2093:13 | S | +| main.rs:2139:13:2139:13 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2139:13:2139:13 | 0 | | {EXTERNAL LOCATION} | usize | +| main.rs:2141:13:2141:14 | xs | | file://:0:0:0:0 | [] | +| main.rs:2141:13:2141:14 | xs | [T;...] | main.rs:2092:5:2093:13 | S | +| main.rs:2141:21:2141:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2141:26:2141:28 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2141:26:2141:28 | [...] | [T;...] | main.rs:2092:5:2093:13 | S | +| main.rs:2141:27:2141:27 | S | | main.rs:2092:5:2093:13 | S | +| main.rs:2142:13:2142:13 | x | | main.rs:2092:5:2093:13 | S | +| main.rs:2142:17:2142:18 | xs | | file://:0:0:0:0 | [] | +| main.rs:2142:17:2142:18 | xs | [T;...] | main.rs:2092:5:2093:13 | S | +| main.rs:2142:17:2142:21 | xs[0] | | main.rs:2092:5:2093:13 | S | +| main.rs:2142:17:2142:27 | ... .foo() | | main.rs:2092:5:2093:13 | S | +| main.rs:2142:20:2142:20 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2144:29:2144:31 | vec | | main.rs:2101:5:2104:5 | MyVec | +| main.rs:2144:29:2144:31 | vec | T | main.rs:2092:5:2093:13 | S | +| main.rs:2144:34:2144:34 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2144:34:2144:34 | 0 | | {EXTERNAL LOCATION} | usize | +| main.rs:2146:23:2146:25 | &xs | | file://:0:0:0:0 | & | +| main.rs:2146:23:2146:25 | &xs | &T | file://:0:0:0:0 | [] | +| main.rs:2146:23:2146:25 | &xs | &T | file://:0:0:0:0 | [] | +| main.rs:2146:23:2146:25 | &xs | &T.[T;...] | main.rs:2092:5:2093:13 | S | +| main.rs:2146:23:2146:25 | &xs | &T.[T] | main.rs:2092:5:2093:13 | S | +| main.rs:2146:24:2146:25 | xs | | file://:0:0:0:0 | [] | +| main.rs:2146:24:2146:25 | xs | [T;...] | main.rs:2092:5:2093:13 | S | +| main.rs:2152:13:2152:13 | x | | {EXTERNAL LOCATION} | String | +| main.rs:2152:17:2152:46 | MacroExpr | | {EXTERNAL LOCATION} | String | +| main.rs:2152:25:2152:35 | "Hello, {}" | | file://:0:0:0:0 | & | +| main.rs:2152:25:2152:35 | "Hello, {}" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2152:25:2152:45 | ...::format(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2152:25:2152:45 | ...::must_use(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2152:25:2152:45 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2152:25:2152:45 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2152:25:2152:45 | { ... } | | {EXTERNAL LOCATION} | String | +| main.rs:2152:38:2152:45 | "World!" | | file://:0:0:0:0 | & | +| main.rs:2152:38:2152:45 | "World!" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2161:19:2161:22 | SelfParam | | main.rs:2157:5:2162:5 | Self [trait MyAdd] | +| main.rs:2161:25:2161:27 | rhs | | main.rs:2157:17:2157:26 | Rhs | +| main.rs:2168:19:2168:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2168:25:2168:29 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2168:45:2170:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2169:13:2169:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2177:19:2177:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2177:25:2177:29 | value | | file://:0:0:0:0 | & | +| main.rs:2177:25:2177:29 | value | &T | {EXTERNAL LOCATION} | i64 | +| main.rs:2177:46:2179:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2178:13:2178:18 | * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2178:14:2178:18 | value | | file://:0:0:0:0 | & | +| main.rs:2178:14:2178:18 | value | &T | {EXTERNAL LOCATION} | i64 | +| main.rs:2186:19:2186:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2186:25:2186:29 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2186:46:2192:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2187:13:2191:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| main.rs:2187:13:2191:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | +| main.rs:2187:16:2187:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2187:22:2189:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2187:22:2189:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2188:17:2188:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2188:17:2188:17 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2189:20:2191:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2189:20:2191:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2190:17:2190:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2190:17:2190:17 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2201:19:2201:22 | SelfParam | | main.rs:2195:5:2195:19 | S | +| main.rs:2201:19:2201:22 | SelfParam | T | main.rs:2197:10:2197:17 | T | +| main.rs:2201:25:2201:29 | other | | main.rs:2195:5:2195:19 | S | +| main.rs:2201:25:2201:29 | other | T | main.rs:2197:10:2197:17 | T | +| main.rs:2201:54:2203:9 | { ... } | | main.rs:2195:5:2195:19 | S | +| main.rs:2201:54:2203:9 | { ... } | T | main.rs:2158:9:2158:20 | Output | +| main.rs:2202:13:2202:39 | S(...) | | main.rs:2195:5:2195:19 | S | +| main.rs:2202:13:2202:39 | S(...) | T | main.rs:2158:9:2158:20 | Output | +| main.rs:2202:15:2202:22 | (...) | | main.rs:2197:10:2197:17 | T | +| main.rs:2202:15:2202:38 | ... .my_add(...) | | main.rs:2158:9:2158:20 | Output | +| main.rs:2202:16:2202:19 | self | | main.rs:2195:5:2195:19 | S | +| main.rs:2202:16:2202:19 | self | T | main.rs:2197:10:2197:17 | T | +| main.rs:2202:16:2202:21 | self.0 | | main.rs:2197:10:2197:17 | T | +| main.rs:2202:31:2202:35 | other | | main.rs:2195:5:2195:19 | S | +| main.rs:2202:31:2202:35 | other | T | main.rs:2197:10:2197:17 | T | +| main.rs:2202:31:2202:37 | other.0 | | main.rs:2157:5:2162:5 | Self [trait MyAdd] | +| main.rs:2202:31:2202:37 | other.0 | | main.rs:2197:10:2197:17 | T | +| main.rs:2210:19:2210:22 | SelfParam | | main.rs:2195:5:2195:19 | S | +| main.rs:2210:19:2210:22 | SelfParam | T | main.rs:2206:10:2206:17 | T | +| main.rs:2210:25:2210:29 | other | | main.rs:2206:10:2206:17 | T | +| main.rs:2210:51:2212:9 | { ... } | | main.rs:2195:5:2195:19 | S | +| main.rs:2210:51:2212:9 | { ... } | T | main.rs:2158:9:2158:20 | Output | +| main.rs:2211:13:2211:37 | S(...) | | main.rs:2195:5:2195:19 | S | +| main.rs:2211:13:2211:37 | S(...) | T | main.rs:2158:9:2158:20 | Output | +| main.rs:2211:15:2211:22 | (...) | | main.rs:2206:10:2206:17 | T | +| main.rs:2211:15:2211:36 | ... .my_add(...) | | main.rs:2158:9:2158:20 | Output | +| main.rs:2211:16:2211:19 | self | | main.rs:2195:5:2195:19 | S | +| main.rs:2211:16:2211:19 | self | T | main.rs:2206:10:2206:17 | T | +| main.rs:2211:16:2211:21 | self.0 | | main.rs:2206:10:2206:17 | T | +| main.rs:2211:31:2211:35 | other | | main.rs:2206:10:2206:17 | T | +| main.rs:2222:19:2222:22 | SelfParam | | main.rs:2195:5:2195:19 | S | +| main.rs:2222:19:2222:22 | SelfParam | T | main.rs:2215:14:2215:14 | T | +| main.rs:2222:25:2222:29 | other | | file://:0:0:0:0 | & | +| main.rs:2222:25:2222:29 | other | &T | main.rs:2215:14:2215:14 | T | +| main.rs:2222:55:2224:9 | { ... } | | main.rs:2195:5:2195:19 | S | +| main.rs:2223:13:2223:37 | S(...) | | main.rs:2195:5:2195:19 | S | +| main.rs:2223:15:2223:22 | (...) | | main.rs:2215:14:2215:14 | T | +| main.rs:2223:16:2223:19 | self | | main.rs:2195:5:2195:19 | S | +| main.rs:2223:16:2223:19 | self | T | main.rs:2215:14:2215:14 | T | +| main.rs:2223:16:2223:21 | self.0 | | main.rs:2215:14:2215:14 | T | +| main.rs:2223:31:2223:35 | other | | file://:0:0:0:0 | & | +| main.rs:2223:31:2223:35 | other | &T | main.rs:2215:14:2215:14 | T | +| main.rs:2229:20:2229:24 | value | | main.rs:2227:18:2227:18 | T | +| main.rs:2234:20:2234:24 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2234:40:2236:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2235:13:2235:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2241:20:2241:24 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2241:41:2247:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2242:13:2246:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| main.rs:2242:13:2246:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | +| main.rs:2242:16:2242:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2242:22:2244:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2242:22:2244:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2243:17:2243:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2243:17:2243:17 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2244:20:2246:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2244:20:2246:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2245:17:2245:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2245:17:2245:17 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2252:21:2252:25 | value | | main.rs:2250:19:2250:19 | T | +| main.rs:2252:31:2252:31 | x | | main.rs:2250:5:2253:5 | Self [trait MyFrom2] | +| main.rs:2257:21:2257:25 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2257:33:2257:33 | _ | | {EXTERNAL LOCATION} | i64 | +| main.rs:2257:48:2259:9 | { ... } | | file://:0:0:0:0 | () | +| main.rs:2258:13:2258:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2264:21:2264:25 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2264:34:2264:34 | _ | | {EXTERNAL LOCATION} | i64 | +| main.rs:2264:49:2270:9 | { ... } | | file://:0:0:0:0 | () | +| main.rs:2265:13:2269:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| main.rs:2265:16:2265:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2265:22:2267:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2266:17:2266:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2267:20:2269:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2268:17:2268:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2275:15:2275:15 | x | | main.rs:2273:5:2279:5 | Self [trait MySelfTrait] | +| main.rs:2278:15:2278:15 | x | | main.rs:2273:5:2279:5 | Self [trait MySelfTrait] | +| main.rs:2283:15:2283:15 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2283:31:2285:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2284:13:2284:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2284:13:2284:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2284:17:2284:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2288:15:2288:15 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2288:32:2290:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2289:13:2289:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2289:13:2289:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2289:17:2289:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2295:15:2295:15 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2295:31:2297:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2296:13:2296:13 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2296:13:2296:13 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2300:15:2300:15 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2300:32:2302:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2301:13:2301:13 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2306:13:2306:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2306:22:2306:23 | 73 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2306:22:2306:23 | 73 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2307:9:2307:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2307:9:2307:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2307:18:2307:21 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2308:9:2308:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2308:9:2308:23 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2308:18:2308:22 | &5i64 | | file://:0:0:0:0 | & | +| main.rs:2308:18:2308:22 | &5i64 | &T | {EXTERNAL LOCATION} | i64 | +| main.rs:2308:19:2308:22 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2309:9:2309:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2309:9:2309:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | | main.rs:2309:18:2309:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2310:9:2310:22 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | -| main.rs:2310:18:2310:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2311:9:2311:30 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2311:25:2311:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2312:9:2312:30 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2312:25:2312:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2313:9:2313:29 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2313:25:2313:28 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2314:9:2314:29 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | -| main.rs:2314:25:2314:28 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2322:26:2324:9 | { ... } | | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2323:13:2323:25 | MyCallable {...} | | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2326:17:2326:21 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2326:17:2326:21 | SelfParam | &T | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2326:31:2328:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2327:13:2327:13 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2327:13:2327:13 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2334:13:2334:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2334:18:2334:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2334:18:2334:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2334:19:2334:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2334:22:2334:22 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2334:25:2334:25 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2335:18:2335:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2335:18:2335:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2335:18:2335:41 | ... .map(...) | | file://:0:0:0:0 | [] | -| main.rs:2335:19:2335:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2335:22:2335:22 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2335:25:2335:25 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2335:32:2335:40 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| main.rs:2335:32:2335:40 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | -| main.rs:2335:40:2335:40 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2336:13:2336:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2336:13:2336:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2336:18:2336:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2336:18:2336:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2336:18:2336:38 | ... .into_iter() | | {EXTERNAL LOCATION} | IntoIter | -| main.rs:2336:18:2336:38 | ... .into_iter() | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2336:19:2336:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2336:22:2336:22 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2336:25:2336:25 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2338:13:2338:17 | vals1 | | file://:0:0:0:0 | [] | -| main.rs:2338:13:2338:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2338:13:2338:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | -| main.rs:2338:21:2338:31 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2338:21:2338:31 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2338:21:2338:31 | [...] | [T;...] | {EXTERNAL LOCATION} | u8 | -| main.rs:2338:22:2338:24 | 1u8 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2338:27:2338:27 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2338:27:2338:27 | 2 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2338:30:2338:30 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2338:30:2338:30 | 3 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2339:13:2339:13 | u | | {EXTERNAL LOCATION} | i32 | -| main.rs:2339:13:2339:13 | u | | {EXTERNAL LOCATION} | u8 | -| main.rs:2339:18:2339:22 | vals1 | | file://:0:0:0:0 | [] | -| main.rs:2339:18:2339:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2339:18:2339:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | -| main.rs:2341:13:2341:17 | vals2 | | file://:0:0:0:0 | [] | -| main.rs:2341:13:2341:17 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2341:21:2341:29 | [1u16; 3] | | file://:0:0:0:0 | [] | -| main.rs:2341:21:2341:29 | [1u16; 3] | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2341:22:2341:25 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2341:28:2341:28 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2342:13:2342:13 | u | | {EXTERNAL LOCATION} | u16 | -| main.rs:2342:18:2342:22 | vals2 | | file://:0:0:0:0 | [] | -| main.rs:2342:18:2342:22 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2344:13:2344:17 | vals3 | | file://:0:0:0:0 | [] | -| main.rs:2344:13:2344:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2344:26:2344:26 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2344:31:2344:39 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2344:31:2344:39 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2344:31:2344:39 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2344:32:2344:32 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2344:32:2344:32 | 1 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2344:35:2344:35 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2344:35:2344:35 | 2 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2344:38:2344:38 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2344:38:2344:38 | 3 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2345:13:2345:13 | u | | {EXTERNAL LOCATION} | u32 | -| main.rs:2345:18:2345:22 | vals3 | | file://:0:0:0:0 | [] | -| main.rs:2345:18:2345:22 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2347:13:2347:17 | vals4 | | file://:0:0:0:0 | [] | -| main.rs:2347:13:2347:17 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2347:26:2347:26 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2347:31:2347:36 | [1; 3] | | file://:0:0:0:0 | [] | -| main.rs:2347:31:2347:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2347:31:2347:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2347:32:2347:32 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2347:32:2347:32 | 1 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2347:35:2347:35 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2348:13:2348:13 | u | | {EXTERNAL LOCATION} | u64 | -| main.rs:2348:18:2348:22 | vals4 | | file://:0:0:0:0 | [] | -| main.rs:2348:18:2348:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2350:17:2350:24 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2350:17:2350:24 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2350:17:2350:24 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2350:28:2350:48 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2350:28:2350:48 | [...] | [T;...] | file://:0:0:0:0 | & | -| main.rs:2350:28:2350:48 | [...] | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2350:29:2350:33 | "foo" | | file://:0:0:0:0 | & | -| main.rs:2350:29:2350:33 | "foo" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2350:36:2350:40 | "bar" | | file://:0:0:0:0 | & | -| main.rs:2350:36:2350:40 | "bar" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2350:43:2350:47 | "baz" | | file://:0:0:0:0 | & | -| main.rs:2350:43:2350:47 | "baz" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2351:13:2351:13 | s | | {EXTERNAL LOCATION} | Item | -| main.rs:2351:13:2351:13 | s | | file://:0:0:0:0 | & | -| main.rs:2351:13:2351:13 | s | &T | file://:0:0:0:0 | & | -| main.rs:2351:13:2351:13 | s | &T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2351:18:2351:26 | &strings1 | | file://:0:0:0:0 | & | -| main.rs:2351:18:2351:26 | &strings1 | &T | file://:0:0:0:0 | [] | -| main.rs:2351:18:2351:26 | &strings1 | &T.[T;...] | file://:0:0:0:0 | & | -| main.rs:2351:18:2351:26 | &strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2351:19:2351:26 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2351:19:2351:26 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2351:19:2351:26 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2352:13:2352:13 | s | | {EXTERNAL LOCATION} | Item | -| main.rs:2352:13:2352:13 | s | | file://:0:0:0:0 | & | -| main.rs:2352:13:2352:13 | s | &T | file://:0:0:0:0 | & | -| main.rs:2352:13:2352:13 | s | &T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2352:18:2352:30 | &mut strings1 | | file://:0:0:0:0 | & | -| main.rs:2352:18:2352:30 | &mut strings1 | &T | file://:0:0:0:0 | [] | -| main.rs:2352:18:2352:30 | &mut strings1 | &T.[T;...] | file://:0:0:0:0 | & | -| main.rs:2352:18:2352:30 | &mut strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2352:23:2352:30 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2352:23:2352:30 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2352:23:2352:30 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2353:13:2353:13 | s | | file://:0:0:0:0 | & | -| main.rs:2353:13:2353:13 | s | &T | {EXTERNAL LOCATION} | str | -| main.rs:2353:18:2353:25 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2353:18:2353:25 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2353:18:2353:25 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2355:13:2355:20 | strings2 | | file://:0:0:0:0 | [] | -| main.rs:2355:13:2355:20 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2356:9:2360:9 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2356:9:2360:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2357:13:2357:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2357:26:2357:30 | "foo" | | file://:0:0:0:0 | & | -| main.rs:2357:26:2357:30 | "foo" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2358:13:2358:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2358:26:2358:30 | "bar" | | file://:0:0:0:0 | & | -| main.rs:2358:26:2358:30 | "bar" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2359:13:2359:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2359:26:2359:30 | "baz" | | file://:0:0:0:0 | & | -| main.rs:2359:26:2359:30 | "baz" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2361:13:2361:13 | s | | {EXTERNAL LOCATION} | String | -| main.rs:2361:18:2361:25 | strings2 | | file://:0:0:0:0 | [] | -| main.rs:2361:18:2361:25 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2363:13:2363:20 | strings3 | | file://:0:0:0:0 | & | -| main.rs:2363:13:2363:20 | strings3 | &T | file://:0:0:0:0 | [] | -| main.rs:2363:13:2363:20 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2364:9:2368:9 | &... | | file://:0:0:0:0 | & | -| main.rs:2364:9:2368:9 | &... | &T | file://:0:0:0:0 | [] | -| main.rs:2364:9:2368:9 | &... | &T.[T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2364:10:2368:9 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2364:10:2368:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2365:13:2365:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2365:26:2365:30 | "foo" | | file://:0:0:0:0 | & | -| main.rs:2365:26:2365:30 | "foo" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2366:13:2366:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2366:26:2366:30 | "bar" | | file://:0:0:0:0 | & | -| main.rs:2366:26:2366:30 | "bar" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2367:13:2367:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2367:26:2367:30 | "baz" | | file://:0:0:0:0 | & | -| main.rs:2367:26:2367:30 | "baz" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2369:13:2369:13 | s | | {EXTERNAL LOCATION} | Item | -| main.rs:2369:13:2369:13 | s | | file://:0:0:0:0 | & | -| main.rs:2369:13:2369:13 | s | &T | {EXTERNAL LOCATION} | String | -| main.rs:2369:18:2369:25 | strings3 | | file://:0:0:0:0 | & | -| main.rs:2369:18:2369:25 | strings3 | &T | file://:0:0:0:0 | [] | -| main.rs:2369:18:2369:25 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2371:13:2371:21 | callables | | file://:0:0:0:0 | [] | -| main.rs:2371:13:2371:21 | callables | [T;...] | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2371:25:2371:81 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2371:25:2371:81 | [...] | [T;...] | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2371:26:2371:42 | ...::new(...) | | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2371:45:2371:61 | ...::new(...) | | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2371:64:2371:80 | ...::new(...) | | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2372:13:2372:13 | c | | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2373:12:2373:20 | callables | | file://:0:0:0:0 | [] | -| main.rs:2373:12:2373:20 | callables | [T;...] | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2375:17:2375:22 | result | | {EXTERNAL LOCATION} | i64 | -| main.rs:2375:26:2375:26 | c | | main.rs:2319:5:2319:24 | MyCallable | -| main.rs:2375:26:2375:33 | c.call() | | {EXTERNAL LOCATION} | i64 | -| main.rs:2380:13:2380:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2380:13:2380:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2380:18:2380:18 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2380:18:2380:22 | 0..10 | | {EXTERNAL LOCATION} | Range | -| main.rs:2380:18:2380:22 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2380:21:2380:22 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2381:13:2381:13 | u | | {EXTERNAL LOCATION} | Range | -| main.rs:2381:13:2381:13 | u | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2381:13:2381:13 | u | Idx | {EXTERNAL LOCATION} | u8 | -| main.rs:2381:18:2381:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2381:18:2381:26 | [...] | [T;...] | {EXTERNAL LOCATION} | Range | -| main.rs:2381:18:2381:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2381:18:2381:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | u8 | -| main.rs:2381:19:2381:21 | 0u8 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2381:19:2381:25 | 0u8..10 | | {EXTERNAL LOCATION} | Range | -| main.rs:2381:19:2381:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2381:19:2381:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | u8 | -| main.rs:2381:24:2381:25 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2381:24:2381:25 | 10 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2382:13:2382:17 | range | | {EXTERNAL LOCATION} | Range | -| main.rs:2382:13:2382:17 | range | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2382:21:2382:21 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2382:21:2382:25 | 0..10 | | {EXTERNAL LOCATION} | Range | -| main.rs:2382:21:2382:25 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2382:24:2382:25 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2383:13:2383:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2383:13:2383:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2383:18:2383:22 | range | | {EXTERNAL LOCATION} | Range | -| main.rs:2383:18:2383:22 | range | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2384:13:2384:22 | range_full | | {EXTERNAL LOCATION} | RangeFull | -| main.rs:2384:26:2384:27 | .. | | {EXTERNAL LOCATION} | RangeFull | -| main.rs:2385:13:2385:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2385:18:2385:48 | &... | | file://:0:0:0:0 | & | -| main.rs:2385:19:2385:36 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2385:19:2385:36 | [...] | [T;...] | {EXTERNAL LOCATION} | i64 | -| main.rs:2385:20:2385:23 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2385:26:2385:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2385:32:2385:35 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2385:38:2385:47 | range_full | | {EXTERNAL LOCATION} | RangeFull | -| main.rs:2387:13:2387:18 | range1 | | {EXTERNAL LOCATION} | Range | -| main.rs:2387:13:2387:18 | range1 | Idx | {EXTERNAL LOCATION} | u16 | -| main.rs:2388:9:2391:9 | ...::Range {...} | | {EXTERNAL LOCATION} | Range | -| main.rs:2388:9:2391:9 | ...::Range {...} | Idx | {EXTERNAL LOCATION} | u16 | -| main.rs:2389:20:2389:23 | 0u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2390:18:2390:22 | 10u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2392:13:2392:13 | u | | {EXTERNAL LOCATION} | Item | -| main.rs:2392:13:2392:13 | u | | {EXTERNAL LOCATION} | u16 | -| main.rs:2392:18:2392:23 | range1 | | {EXTERNAL LOCATION} | Range | -| main.rs:2392:18:2392:23 | range1 | Idx | {EXTERNAL LOCATION} | u16 | -| main.rs:2396:26:2396:26 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2396:29:2396:29 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2396:32:2396:32 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2399:13:2399:18 | vals4a | | {EXTERNAL LOCATION} | Vec | -| main.rs:2399:13:2399:18 | vals4a | A | {EXTERNAL LOCATION} | Global | -| main.rs:2399:13:2399:18 | vals4a | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2399:32:2399:43 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2399:32:2399:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2399:32:2399:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2399:32:2399:52 | ... .to_vec() | | {EXTERNAL LOCATION} | Vec | -| main.rs:2399:32:2399:52 | ... .to_vec() | A | {EXTERNAL LOCATION} | Global | -| main.rs:2399:32:2399:52 | ... .to_vec() | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2399:33:2399:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2399:39:2399:39 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2399:39:2399:39 | 2 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2399:42:2399:42 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2399:42:2399:42 | 3 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2400:13:2400:13 | u | | {EXTERNAL LOCATION} | u16 | -| main.rs:2400:13:2400:13 | u | | file://:0:0:0:0 | & | -| main.rs:2400:18:2400:23 | vals4a | | {EXTERNAL LOCATION} | Vec | -| main.rs:2400:18:2400:23 | vals4a | A | {EXTERNAL LOCATION} | Global | -| main.rs:2400:18:2400:23 | vals4a | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2402:22:2402:33 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2402:22:2402:33 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2402:22:2402:33 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2402:23:2402:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2402:29:2402:29 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2402:29:2402:29 | 2 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2402:32:2402:32 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2402:32:2402:32 | 3 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2405:13:2405:17 | vals5 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2405:13:2405:17 | vals5 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2405:13:2405:17 | vals5 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2405:13:2405:17 | vals5 | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2405:21:2405:43 | ...::from(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2405:21:2405:43 | ...::from(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2405:21:2405:43 | ...::from(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2405:21:2405:43 | ...::from(...) | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2405:31:2405:42 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2405:31:2405:42 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2405:31:2405:42 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2405:32:2405:35 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2405:38:2405:38 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2405:38:2405:38 | 2 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2405:41:2405:41 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2405:41:2405:41 | 3 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2406:13:2406:13 | u | | {EXTERNAL LOCATION} | i32 | -| main.rs:2406:13:2406:13 | u | | {EXTERNAL LOCATION} | u32 | -| main.rs:2406:13:2406:13 | u | | file://:0:0:0:0 | & | -| main.rs:2406:18:2406:22 | vals5 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2406:18:2406:22 | vals5 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2406:18:2406:22 | vals5 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2406:18:2406:22 | vals5 | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2408:13:2408:17 | vals6 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2408:13:2408:17 | vals6 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2408:13:2408:17 | vals6 | T | file://:0:0:0:0 | & | -| main.rs:2408:13:2408:17 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2408:32:2408:43 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2408:32:2408:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2408:32:2408:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2408:32:2408:60 | ... .collect() | | {EXTERNAL LOCATION} | Vec | -| main.rs:2408:32:2408:60 | ... .collect() | A | {EXTERNAL LOCATION} | Global | -| main.rs:2408:32:2408:60 | ... .collect() | T | file://:0:0:0:0 | & | -| main.rs:2408:32:2408:60 | ... .collect() | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2408:33:2408:36 | 1u64 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2408:39:2408:39 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2408:39:2408:39 | 2 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2408:42:2408:42 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2408:42:2408:42 | 3 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2409:13:2409:13 | u | | file://:0:0:0:0 | & | -| main.rs:2409:13:2409:13 | u | &T | {EXTERNAL LOCATION} | u64 | -| main.rs:2409:18:2409:22 | vals6 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2409:18:2409:22 | vals6 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2409:18:2409:22 | vals6 | T | file://:0:0:0:0 | & | -| main.rs:2409:18:2409:22 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2411:17:2411:21 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2411:17:2411:21 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2411:17:2411:21 | vals7 | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2411:25:2411:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2411:25:2411:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2411:25:2411:34 | ...::new(...) | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2412:9:2412:13 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2412:9:2412:13 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2412:9:2412:13 | vals7 | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2412:20:2412:22 | 1u8 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2413:13:2413:13 | u | | {EXTERNAL LOCATION} | u8 | -| main.rs:2413:13:2413:13 | u | | file://:0:0:0:0 | & | -| main.rs:2413:18:2413:22 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2413:18:2413:22 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2413:18:2413:22 | vals7 | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2415:33:2415:33 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2415:36:2415:36 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2415:45:2415:45 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2415:48:2415:48 | 4 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2422:17:2422:20 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2422:17:2422:20 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2422:17:2422:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2422:17:2422:20 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2422:17:2422:20 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2422:17:2422:20 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2422:17:2422:20 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2422:24:2422:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2422:24:2422:55 | ...::new(...) | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2422:24:2422:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2422:24:2422:55 | ...::new(...) | V | {EXTERNAL LOCATION} | Box | -| main.rs:2422:24:2422:55 | ...::new(...) | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2422:24:2422:55 | ...::new(...) | V.T | file://:0:0:0:0 | & | -| main.rs:2422:24:2422:55 | ...::new(...) | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2423:9:2423:12 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2423:9:2423:12 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2423:9:2423:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2423:9:2423:12 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2423:9:2423:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2423:9:2423:12 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2423:9:2423:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2423:9:2423:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2423:9:2423:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | -| main.rs:2423:9:2423:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2423:9:2423:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | -| main.rs:2423:9:2423:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2423:21:2423:21 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2423:24:2423:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2423:24:2423:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2423:24:2423:38 | ...::new(...) | T | file://:0:0:0:0 | & | -| main.rs:2423:24:2423:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2423:33:2423:37 | "one" | | file://:0:0:0:0 | & | -| main.rs:2423:33:2423:37 | "one" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2424:9:2424:12 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2424:9:2424:12 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2424:9:2424:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2424:9:2424:12 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2424:9:2424:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2424:9:2424:12 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2424:9:2424:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2424:9:2424:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2424:9:2424:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | -| main.rs:2424:9:2424:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2424:9:2424:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | -| main.rs:2424:9:2424:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2424:21:2424:21 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2424:24:2424:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2424:24:2424:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2424:24:2424:38 | ...::new(...) | T | file://:0:0:0:0 | & | -| main.rs:2424:24:2424:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2424:33:2424:37 | "two" | | file://:0:0:0:0 | & | -| main.rs:2424:33:2424:37 | "two" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2425:13:2425:15 | key | | {EXTERNAL LOCATION} | Item | -| main.rs:2425:13:2425:15 | key | | file://:0:0:0:0 | & | -| main.rs:2425:13:2425:15 | key | &T | {EXTERNAL LOCATION} | i32 | -| main.rs:2425:20:2425:23 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2425:20:2425:23 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2425:20:2425:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2425:20:2425:23 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2425:20:2425:23 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2425:20:2425:23 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2425:20:2425:23 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2425:20:2425:30 | map1.keys() | | {EXTERNAL LOCATION} | Keys | -| main.rs:2425:20:2425:30 | map1.keys() | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2425:20:2425:30 | map1.keys() | V | {EXTERNAL LOCATION} | Box | -| main.rs:2425:20:2425:30 | map1.keys() | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2425:20:2425:30 | map1.keys() | V.T | file://:0:0:0:0 | & | -| main.rs:2425:20:2425:30 | map1.keys() | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2426:13:2426:17 | value | | {EXTERNAL LOCATION} | Item | -| main.rs:2426:13:2426:17 | value | | file://:0:0:0:0 | & | -| main.rs:2426:13:2426:17 | value | &T | {EXTERNAL LOCATION} | Box | -| main.rs:2426:13:2426:17 | value | &T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2426:13:2426:17 | value | &T.T | file://:0:0:0:0 | & | -| main.rs:2426:13:2426:17 | value | &T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2426:22:2426:25 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2426:22:2426:25 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2426:22:2426:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2426:22:2426:25 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2426:22:2426:25 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2426:22:2426:25 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2426:22:2426:25 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2426:22:2426:34 | map1.values() | | {EXTERNAL LOCATION} | Values | -| main.rs:2426:22:2426:34 | map1.values() | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2426:22:2426:34 | map1.values() | V | {EXTERNAL LOCATION} | Box | -| main.rs:2426:22:2426:34 | map1.values() | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2426:22:2426:34 | map1.values() | V.T | file://:0:0:0:0 | & | -| main.rs:2426:22:2426:34 | map1.values() | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2427:13:2427:24 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2427:13:2427:24 | TuplePat | 0(2) | file://:0:0:0:0 | & | -| main.rs:2427:13:2427:24 | TuplePat | 0(2).&T | {EXTERNAL LOCATION} | i32 | -| main.rs:2427:13:2427:24 | TuplePat | 1(2) | file://:0:0:0:0 | & | -| main.rs:2427:13:2427:24 | TuplePat | 1(2).&T | {EXTERNAL LOCATION} | Box | -| main.rs:2427:13:2427:24 | TuplePat | 1(2).&T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2427:13:2427:24 | TuplePat | 1(2).&T.T | file://:0:0:0:0 | & | -| main.rs:2427:13:2427:24 | TuplePat | 1(2).&T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2427:14:2427:16 | key | | file://:0:0:0:0 | & | -| main.rs:2427:14:2427:16 | key | &T | {EXTERNAL LOCATION} | i32 | -| main.rs:2427:19:2427:23 | value | | file://:0:0:0:0 | & | -| main.rs:2427:19:2427:23 | value | &T | {EXTERNAL LOCATION} | Box | -| main.rs:2427:19:2427:23 | value | &T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2427:19:2427:23 | value | &T.T | file://:0:0:0:0 | & | -| main.rs:2427:19:2427:23 | value | &T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2427:29:2427:32 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2427:29:2427:32 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2427:29:2427:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2427:29:2427:32 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2427:29:2427:32 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2427:29:2427:32 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2427:29:2427:32 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2427:29:2427:39 | map1.iter() | | {EXTERNAL LOCATION} | Iter | -| main.rs:2427:29:2427:39 | map1.iter() | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2427:29:2427:39 | map1.iter() | V | {EXTERNAL LOCATION} | Box | -| main.rs:2427:29:2427:39 | map1.iter() | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2427:29:2427:39 | map1.iter() | V.T | file://:0:0:0:0 | & | -| main.rs:2427:29:2427:39 | map1.iter() | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2428:13:2428:24 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2428:13:2428:24 | TuplePat | 0(2) | file://:0:0:0:0 | & | -| main.rs:2428:13:2428:24 | TuplePat | 0(2).&T | {EXTERNAL LOCATION} | i32 | -| main.rs:2428:13:2428:24 | TuplePat | 1(2) | file://:0:0:0:0 | & | -| main.rs:2428:13:2428:24 | TuplePat | 1(2).&T | {EXTERNAL LOCATION} | Box | -| main.rs:2428:13:2428:24 | TuplePat | 1(2).&T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2428:13:2428:24 | TuplePat | 1(2).&T.T | file://:0:0:0:0 | & | -| main.rs:2428:13:2428:24 | TuplePat | 1(2).&T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2428:14:2428:16 | key | | file://:0:0:0:0 | & | -| main.rs:2428:14:2428:16 | key | &T | {EXTERNAL LOCATION} | i32 | -| main.rs:2428:19:2428:23 | value | | file://:0:0:0:0 | & | -| main.rs:2428:19:2428:23 | value | &T | {EXTERNAL LOCATION} | Box | -| main.rs:2428:19:2428:23 | value | &T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2428:19:2428:23 | value | &T.T | file://:0:0:0:0 | & | -| main.rs:2428:19:2428:23 | value | &T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2428:29:2428:33 | &map1 | | file://:0:0:0:0 | & | -| main.rs:2428:29:2428:33 | &map1 | &T | {EXTERNAL LOCATION} | HashMap | -| main.rs:2428:29:2428:33 | &map1 | &T.K | {EXTERNAL LOCATION} | i32 | -| main.rs:2428:29:2428:33 | &map1 | &T.S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2428:29:2428:33 | &map1 | &T.V | {EXTERNAL LOCATION} | Box | -| main.rs:2428:29:2428:33 | &map1 | &T.V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2428:29:2428:33 | &map1 | &T.V.T | file://:0:0:0:0 | & | -| main.rs:2428:29:2428:33 | &map1 | &T.V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2428:30:2428:33 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2428:30:2428:33 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2428:30:2428:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2428:30:2428:33 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2428:30:2428:33 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2428:30:2428:33 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2428:30:2428:33 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2432:17:2432:17 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2432:26:2432:26 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2432:26:2432:26 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2434:23:2434:23 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2434:23:2434:28 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2434:27:2434:28 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2434:27:2434:28 | 10 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2436:13:2436:13 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2436:13:2436:18 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:2436:18:2436:18 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2448:40:2450:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:2448:40:2450:9 | { ... } | T | main.rs:2442:5:2442:20 | S1 | -| main.rs:2448:40:2450:9 | { ... } | T.T | main.rs:2447:10:2447:19 | T | -| main.rs:2449:13:2449:16 | None | | {EXTERNAL LOCATION} | Option | -| main.rs:2449:13:2449:16 | None | T | main.rs:2442:5:2442:20 | S1 | -| main.rs:2449:13:2449:16 | None | T.T | main.rs:2447:10:2447:19 | T | -| main.rs:2452:30:2454:9 | { ... } | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2452:30:2454:9 | { ... } | T | main.rs:2447:10:2447:19 | T | -| main.rs:2453:13:2453:28 | S1(...) | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2453:13:2453:28 | S1(...) | T | main.rs:2447:10:2447:19 | T | -| main.rs:2453:16:2453:27 | ...::default(...) | | main.rs:2447:10:2447:19 | T | -| main.rs:2456:19:2456:22 | SelfParam | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2456:19:2456:22 | SelfParam | T | main.rs:2447:10:2447:19 | T | -| main.rs:2456:33:2458:9 | { ... } | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2456:33:2458:9 | { ... } | T | main.rs:2447:10:2447:19 | T | -| main.rs:2457:13:2457:16 | self | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2457:13:2457:16 | self | T | main.rs:2447:10:2447:19 | T | -| main.rs:2469:15:2469:15 | x | | main.rs:2469:12:2469:12 | T | -| main.rs:2469:26:2471:5 | { ... } | | main.rs:2469:12:2469:12 | T | -| main.rs:2470:9:2470:9 | x | | main.rs:2469:12:2469:12 | T | -| main.rs:2474:13:2474:14 | x1 | | {EXTERNAL LOCATION} | Option | -| main.rs:2474:13:2474:14 | x1 | T | main.rs:2442:5:2442:20 | S1 | -| main.rs:2474:13:2474:14 | x1 | T.T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2474:34:2474:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2474:34:2474:48 | ...::assoc_fun(...) | T | main.rs:2442:5:2442:20 | S1 | -| main.rs:2474:34:2474:48 | ...::assoc_fun(...) | T.T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2475:13:2475:14 | x2 | | {EXTERNAL LOCATION} | Option | -| main.rs:2475:13:2475:14 | x2 | T | main.rs:2442:5:2442:20 | S1 | -| main.rs:2475:13:2475:14 | x2 | T.T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2475:18:2475:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2475:18:2475:38 | ...::assoc_fun(...) | T | main.rs:2442:5:2442:20 | S1 | -| main.rs:2475:18:2475:38 | ...::assoc_fun(...) | T.T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2476:13:2476:14 | x3 | | {EXTERNAL LOCATION} | Option | -| main.rs:2476:13:2476:14 | x3 | T | main.rs:2442:5:2442:20 | S1 | -| main.rs:2476:13:2476:14 | x3 | T.T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2476:18:2476:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2476:18:2476:32 | ...::assoc_fun(...) | T | main.rs:2442:5:2442:20 | S1 | -| main.rs:2476:18:2476:32 | ...::assoc_fun(...) | T.T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2477:13:2477:14 | x4 | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2477:13:2477:14 | x4 | T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2477:18:2477:48 | ...::method(...) | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2477:18:2477:48 | ...::method(...) | T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2477:35:2477:47 | ...::default(...) | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2477:35:2477:47 | ...::default(...) | T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2478:13:2478:14 | x5 | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2478:13:2478:14 | x5 | T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2478:18:2478:42 | ...::method(...) | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2478:18:2478:42 | ...::method(...) | T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2478:29:2478:41 | ...::default(...) | | main.rs:2442:5:2442:20 | S1 | -| main.rs:2478:29:2478:41 | ...::default(...) | T | main.rs:2444:5:2445:14 | S2 | -| main.rs:2479:13:2479:14 | x6 | | main.rs:2463:5:2463:27 | S4 | -| main.rs:2479:13:2479:14 | x6 | T4 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2479:18:2479:45 | S4::<...>(...) | | main.rs:2463:5:2463:27 | S4 | -| main.rs:2479:18:2479:45 | S4::<...>(...) | T4 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2479:27:2479:44 | ...::default(...) | | main.rs:2444:5:2445:14 | S2 | -| main.rs:2480:13:2480:14 | x7 | | main.rs:2463:5:2463:27 | S4 | -| main.rs:2480:13:2480:14 | x7 | T4 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2480:18:2480:23 | S4(...) | | main.rs:2463:5:2463:27 | S4 | -| main.rs:2480:18:2480:23 | S4(...) | T4 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2480:21:2480:22 | S2 | | main.rs:2444:5:2445:14 | S2 | -| main.rs:2481:13:2481:14 | x8 | | main.rs:2463:5:2463:27 | S4 | -| main.rs:2481:13:2481:14 | x8 | T4 | {EXTERNAL LOCATION} | i32 | -| main.rs:2481:18:2481:22 | S4(...) | | main.rs:2463:5:2463:27 | S4 | -| main.rs:2481:18:2481:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 | -| main.rs:2481:21:2481:21 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2482:13:2482:14 | x9 | | main.rs:2463:5:2463:27 | S4 | -| main.rs:2482:13:2482:14 | x9 | T4 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2482:18:2482:34 | S4(...) | | main.rs:2463:5:2463:27 | S4 | -| main.rs:2482:18:2482:34 | S4(...) | T4 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2482:21:2482:33 | ...::default(...) | | main.rs:2444:5:2445:14 | S2 | -| main.rs:2483:13:2483:15 | x10 | | main.rs:2465:5:2467:5 | S5 | -| main.rs:2483:13:2483:15 | x10 | T5 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2483:19:2486:9 | S5::<...> {...} | | main.rs:2465:5:2467:5 | S5 | -| main.rs:2483:19:2486:9 | S5::<...> {...} | T5 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2485:20:2485:37 | ...::default(...) | | main.rs:2444:5:2445:14 | S2 | -| main.rs:2487:13:2487:15 | x11 | | main.rs:2465:5:2467:5 | S5 | -| main.rs:2487:13:2487:15 | x11 | T5 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2487:19:2487:34 | S5 {...} | | main.rs:2465:5:2467:5 | S5 | -| main.rs:2487:19:2487:34 | S5 {...} | T5 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2487:31:2487:32 | S2 | | main.rs:2444:5:2445:14 | S2 | -| main.rs:2488:13:2488:15 | x12 | | main.rs:2465:5:2467:5 | S5 | -| main.rs:2488:13:2488:15 | x12 | T5 | {EXTERNAL LOCATION} | i32 | -| main.rs:2488:19:2488:33 | S5 {...} | | main.rs:2465:5:2467:5 | S5 | -| main.rs:2488:19:2488:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 | -| main.rs:2488:31:2488:31 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2489:13:2489:15 | x13 | | main.rs:2465:5:2467:5 | S5 | -| main.rs:2489:13:2489:15 | x13 | T5 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2489:19:2492:9 | S5 {...} | | main.rs:2465:5:2467:5 | S5 | -| main.rs:2489:19:2492:9 | S5 {...} | T5 | main.rs:2444:5:2445:14 | S2 | -| main.rs:2491:20:2491:32 | ...::default(...) | | main.rs:2444:5:2445:14 | S2 | -| main.rs:2493:13:2493:15 | x14 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2493:19:2493:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | -| main.rs:2493:30:2493:47 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | -| main.rs:2502:35:2504:9 | { ... } | | file://:0:0:0:0 | (T_2) | -| main.rs:2502:35:2504:9 | { ... } | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2502:35:2504:9 | { ... } | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2503:13:2503:26 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| main.rs:2503:13:2503:26 | TupleExpr | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2503:13:2503:26 | TupleExpr | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2503:14:2503:18 | S1 {...} | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2503:21:2503:25 | S1 {...} | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2505:16:2505:19 | SelfParam | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2509:13:2509:13 | a | | file://:0:0:0:0 | (T_2) | -| main.rs:2509:13:2509:13 | a | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2509:13:2509:13 | a | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2509:17:2509:30 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2509:17:2509:30 | ...::get_pair(...) | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2509:17:2509:30 | ...::get_pair(...) | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2510:17:2510:17 | b | | file://:0:0:0:0 | (T_2) | -| main.rs:2510:17:2510:17 | b | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2510:17:2510:17 | b | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2510:21:2510:34 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2510:21:2510:34 | ...::get_pair(...) | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2510:21:2510:34 | ...::get_pair(...) | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2511:13:2511:18 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2511:13:2511:18 | TuplePat | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2511:13:2511:18 | TuplePat | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2511:14:2511:14 | c | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2511:17:2511:17 | d | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2511:22:2511:35 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2511:22:2511:35 | ...::get_pair(...) | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2511:22:2511:35 | ...::get_pair(...) | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2512:13:2512:22 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2512:13:2512:22 | TuplePat | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2512:13:2512:22 | TuplePat | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2512:18:2512:18 | e | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2512:21:2512:21 | f | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2512:26:2512:39 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2512:26:2512:39 | ...::get_pair(...) | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2512:26:2512:39 | ...::get_pair(...) | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2513:13:2513:26 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2513:13:2513:26 | TuplePat | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2513:13:2513:26 | TuplePat | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2513:18:2513:18 | g | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2513:25:2513:25 | h | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2513:30:2513:43 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2513:30:2513:43 | ...::get_pair(...) | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2513:30:2513:43 | ...::get_pair(...) | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2515:9:2515:9 | a | | file://:0:0:0:0 | (T_2) | -| main.rs:2515:9:2515:9 | a | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2515:9:2515:9 | a | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2515:9:2515:11 | a.0 | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2516:9:2516:9 | b | | file://:0:0:0:0 | (T_2) | -| main.rs:2516:9:2516:9 | b | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2516:9:2516:9 | b | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2516:9:2516:11 | b.1 | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2517:9:2517:9 | c | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2518:9:2518:9 | d | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2519:9:2519:9 | e | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2520:9:2520:9 | f | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2521:9:2521:9 | g | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2522:9:2522:9 | h | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2527:13:2527:13 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2527:17:2527:34 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2528:13:2528:13 | b | | {EXTERNAL LOCATION} | bool | -| main.rs:2528:17:2528:34 | ...::default(...) | | {EXTERNAL LOCATION} | bool | -| main.rs:2529:13:2529:16 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2529:13:2529:16 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | -| main.rs:2529:13:2529:16 | pair | 1(2) | {EXTERNAL LOCATION} | bool | -| main.rs:2529:20:2529:25 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| main.rs:2529:20:2529:25 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i64 | -| main.rs:2529:20:2529:25 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | bool | -| main.rs:2529:21:2529:21 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2529:24:2529:24 | b | | {EXTERNAL LOCATION} | bool | -| main.rs:2530:13:2530:13 | i | | {EXTERNAL LOCATION} | i64 | -| main.rs:2530:22:2530:25 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2530:22:2530:25 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | -| main.rs:2530:22:2530:25 | pair | 1(2) | {EXTERNAL LOCATION} | bool | -| main.rs:2530:22:2530:27 | pair.0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2531:13:2531:13 | j | | {EXTERNAL LOCATION} | bool | -| main.rs:2531:23:2531:26 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2531:23:2531:26 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | -| main.rs:2531:23:2531:26 | pair | 1(2) | {EXTERNAL LOCATION} | bool | -| main.rs:2531:23:2531:28 | pair.1 | | {EXTERNAL LOCATION} | bool | -| main.rs:2533:13:2533:16 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2533:13:2533:16 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2533:13:2533:16 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2533:20:2533:25 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2533:20:2533:25 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2533:20:2533:32 | ... .into() | | file://:0:0:0:0 | (T_2) | -| main.rs:2533:20:2533:32 | ... .into() | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2533:20:2533:32 | ... .into() | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2533:21:2533:21 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2533:24:2533:24 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2534:15:2534:18 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2534:15:2534:18 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2534:15:2534:18 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2535:13:2535:18 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2535:13:2535:18 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2535:13:2535:18 | TuplePat | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2535:14:2535:14 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2535:17:2535:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2535:30:2535:41 | "unexpected" | | file://:0:0:0:0 | & | -| main.rs:2535:30:2535:41 | "unexpected" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2535:30:2535:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2535:30:2535:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2536:13:2536:13 | _ | | file://:0:0:0:0 | (T_2) | -| main.rs:2536:13:2536:13 | _ | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2536:13:2536:13 | _ | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2536:25:2536:34 | "expected" | | file://:0:0:0:0 | & | -| main.rs:2536:25:2536:34 | "expected" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2536:25:2536:34 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2536:25:2536:34 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2538:13:2538:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2538:17:2538:20 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2538:17:2538:20 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2538:17:2538:20 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2538:17:2538:22 | pair.0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2540:13:2540:13 | y | | file://:0:0:0:0 | & | -| main.rs:2540:13:2540:13 | y | &T | file://:0:0:0:0 | (T_2) | -| main.rs:2540:13:2540:13 | y | &T.0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2540:13:2540:13 | y | &T.1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2540:17:2540:31 | &... | | file://:0:0:0:0 | & | -| main.rs:2540:17:2540:31 | &... | &T | file://:0:0:0:0 | (T_2) | -| main.rs:2540:17:2540:31 | &... | &T.0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2540:17:2540:31 | &... | &T.1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2540:18:2540:31 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2540:18:2540:31 | ...::get_pair(...) | 0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2540:18:2540:31 | ...::get_pair(...) | 1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2541:9:2541:9 | y | | file://:0:0:0:0 | & | -| main.rs:2541:9:2541:9 | y | &T | file://:0:0:0:0 | (T_2) | -| main.rs:2541:9:2541:9 | y | &T.0(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2541:9:2541:9 | y | &T.1(2) | main.rs:2498:5:2499:16 | S1 | -| main.rs:2541:9:2541:11 | y.0 | | main.rs:2498:5:2499:16 | S1 | -| main.rs:2548:13:2548:23 | boxed_value | | {EXTERNAL LOCATION} | Box | -| main.rs:2548:13:2548:23 | boxed_value | A | {EXTERNAL LOCATION} | Global | -| main.rs:2548:13:2548:23 | boxed_value | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2548:27:2548:42 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2548:27:2548:42 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2548:27:2548:42 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2548:36:2548:41 | 100i32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2551:15:2551:25 | boxed_value | | {EXTERNAL LOCATION} | Box | -| main.rs:2551:15:2551:25 | boxed_value | A | {EXTERNAL LOCATION} | Global | -| main.rs:2551:15:2551:25 | boxed_value | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2552:13:2552:19 | box 100 | | {EXTERNAL LOCATION} | Box | -| main.rs:2552:13:2552:19 | box 100 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2552:13:2552:19 | box 100 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2552:17:2552:19 | 100 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2553:26:2553:36 | "Boxed 100\\n" | | file://:0:0:0:0 | & | -| main.rs:2553:26:2553:36 | "Boxed 100\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2553:26:2553:36 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2553:26:2553:36 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2555:13:2555:17 | box ... | | {EXTERNAL LOCATION} | Box | -| main.rs:2555:13:2555:17 | box ... | A | {EXTERNAL LOCATION} | Global | -| main.rs:2555:13:2555:17 | box ... | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2557:26:2557:42 | "Boxed value: {}\\n" | | file://:0:0:0:0 | & | -| main.rs:2557:26:2557:42 | "Boxed value: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2557:26:2557:51 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2557:26:2557:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2562:13:2562:22 | nested_box | | {EXTERNAL LOCATION} | Box | -| main.rs:2562:13:2562:22 | nested_box | A | {EXTERNAL LOCATION} | Global | -| main.rs:2562:13:2562:22 | nested_box | T | {EXTERNAL LOCATION} | Box | -| main.rs:2562:13:2562:22 | nested_box | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2562:13:2562:22 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2562:26:2562:50 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2562:26:2562:50 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2562:26:2562:50 | ...::new(...) | T | {EXTERNAL LOCATION} | Box | -| main.rs:2562:26:2562:50 | ...::new(...) | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2562:26:2562:50 | ...::new(...) | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2562:35:2562:49 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2562:35:2562:49 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2562:35:2562:49 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2562:44:2562:48 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2563:15:2563:24 | nested_box | | {EXTERNAL LOCATION} | Box | -| main.rs:2563:15:2563:24 | nested_box | A | {EXTERNAL LOCATION} | Global | -| main.rs:2563:15:2563:24 | nested_box | T | {EXTERNAL LOCATION} | Box | -| main.rs:2563:15:2563:24 | nested_box | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2563:15:2563:24 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2564:13:2564:21 | box ... | | {EXTERNAL LOCATION} | Box | -| main.rs:2564:13:2564:21 | box ... | A | {EXTERNAL LOCATION} | Global | -| main.rs:2564:13:2564:21 | box ... | T | {EXTERNAL LOCATION} | Box | -| main.rs:2564:13:2564:21 | box ... | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2564:13:2564:21 | box ... | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2566:26:2566:43 | "Nested boxed: {}\\n" | | file://:0:0:0:0 | & | -| main.rs:2566:26:2566:43 | "Nested boxed: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2566:26:2566:59 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2566:26:2566:59 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2578:21:2578:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2578:21:2578:25 | SelfParam | &T | main.rs:2577:5:2580:5 | Self [trait Executor] | -| main.rs:2579:24:2579:28 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2579:24:2579:28 | SelfParam | &T | main.rs:2577:5:2580:5 | Self [trait Executor] | -| main.rs:2579:31:2579:35 | query | | main.rs:2579:21:2579:21 | E | -| main.rs:2583:21:2583:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2583:21:2583:25 | SelfParam | &T | main.rs:2582:10:2582:22 | T | -| main.rs:2584:22:2584:41 | "Executor::execute1\\n" | | file://:0:0:0:0 | & | -| main.rs:2584:22:2584:41 | "Executor::execute1\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2584:22:2584:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2584:22:2584:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2587:24:2587:28 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2587:24:2587:28 | SelfParam | &T | main.rs:2582:10:2582:22 | T | -| main.rs:2587:31:2587:36 | _query | | main.rs:2587:21:2587:21 | E | -| main.rs:2588:22:2588:41 | "Executor::execute2\\n" | | file://:0:0:0:0 | & | -| main.rs:2588:22:2588:41 | "Executor::execute2\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2588:22:2588:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2588:22:2588:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2597:13:2597:13 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2597:17:2597:34 | MySqlConnection {...} | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2599:9:2599:9 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2600:35:2600:36 | &c | | file://:0:0:0:0 | & | -| main.rs:2600:35:2600:36 | &c | &T | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2600:36:2600:36 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2602:9:2602:9 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2602:20:2602:40 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| main.rs:2602:20:2602:40 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2603:9:2603:9 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2603:28:2603:48 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| main.rs:2603:28:2603:48 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2604:35:2604:36 | &c | | file://:0:0:0:0 | & | -| main.rs:2604:35:2604:36 | &c | &T | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2604:36:2604:36 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2604:39:2604:59 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| main.rs:2604:39:2604:59 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2605:43:2605:44 | &c | | file://:0:0:0:0 | & | -| main.rs:2605:43:2605:44 | &c | &T | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2605:44:2605:44 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2605:47:2605:67 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| main.rs:2605:47:2605:67 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2615:36:2617:9 | { ... } | | main.rs:2612:5:2612:22 | Path | -| main.rs:2616:13:2616:19 | Path {...} | | main.rs:2612:5:2612:22 | Path | -| main.rs:2619:29:2619:33 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2619:29:2619:33 | SelfParam | &T | main.rs:2612:5:2612:22 | Path | -| main.rs:2619:59:2621:9 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:2619:59:2621:9 | { ... } | E | file://:0:0:0:0 | () | -| main.rs:2619:59:2621:9 | { ... } | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2620:13:2620:30 | Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:2620:13:2620:30 | Ok(...) | E | file://:0:0:0:0 | () | -| main.rs:2620:13:2620:30 | Ok(...) | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2620:16:2620:29 | ...::new(...) | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2627:39:2629:9 | { ... } | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2628:13:2628:22 | PathBuf {...} | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2637:18:2637:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2637:18:2637:22 | SelfParam | &T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2637:34:2641:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:2637:34:2641:9 | { ... } | &T | main.rs:2612:5:2612:22 | Path | -| main.rs:2639:33:2639:43 | ...::new(...) | | main.rs:2612:5:2612:22 | Path | -| main.rs:2640:13:2640:17 | &path | | file://:0:0:0:0 | & | -| main.rs:2640:13:2640:17 | &path | &T | main.rs:2612:5:2612:22 | Path | -| main.rs:2640:14:2640:17 | path | | main.rs:2612:5:2612:22 | Path | -| main.rs:2645:13:2645:17 | path1 | | main.rs:2612:5:2612:22 | Path | -| main.rs:2645:21:2645:31 | ...::new(...) | | main.rs:2612:5:2612:22 | Path | -| main.rs:2646:13:2646:17 | path2 | | {EXTERNAL LOCATION} | Result | -| main.rs:2646:13:2646:17 | path2 | E | file://:0:0:0:0 | () | -| main.rs:2646:13:2646:17 | path2 | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2646:21:2646:25 | path1 | | main.rs:2612:5:2612:22 | Path | -| main.rs:2646:21:2646:40 | path1.canonicalize() | | {EXTERNAL LOCATION} | Result | -| main.rs:2646:21:2646:40 | path1.canonicalize() | E | file://:0:0:0:0 | () | -| main.rs:2646:21:2646:40 | path1.canonicalize() | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2647:13:2647:17 | path3 | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2647:21:2647:25 | path2 | | {EXTERNAL LOCATION} | Result | -| main.rs:2647:21:2647:25 | path2 | E | file://:0:0:0:0 | () | -| main.rs:2647:21:2647:25 | path2 | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2647:21:2647:34 | path2.unwrap() | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2649:13:2649:20 | pathbuf1 | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2649:24:2649:37 | ...::new(...) | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2650:24:2650:31 | pathbuf1 | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2661:5:2661:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2662:5:2662:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2662:20:2662:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2662:41:2662:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2678:5:2678:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future | +| main.rs:2311:9:2311:15 | S(...) | | main.rs:2195:5:2195:19 | S | +| main.rs:2311:9:2311:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2311:9:2311:31 | ... .my_add(...) | | main.rs:2195:5:2195:19 | S | +| main.rs:2311:11:2311:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2311:24:2311:30 | S(...) | | main.rs:2195:5:2195:19 | S | +| main.rs:2311:24:2311:30 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2311:26:2311:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2312:9:2312:15 | S(...) | | main.rs:2195:5:2195:19 | S | +| main.rs:2312:9:2312:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2312:11:2312:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2312:24:2312:27 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2313:9:2313:15 | S(...) | | main.rs:2195:5:2195:19 | S | +| main.rs:2313:9:2313:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2313:9:2313:29 | ... .my_add(...) | | main.rs:2195:5:2195:19 | S | +| main.rs:2313:11:2313:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2313:24:2313:28 | &3i64 | | file://:0:0:0:0 | & | +| main.rs:2313:24:2313:28 | &3i64 | &T | {EXTERNAL LOCATION} | i64 | +| main.rs:2313:25:2313:28 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2315:13:2315:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2315:17:2315:35 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2315:30:2315:34 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2316:13:2316:13 | y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2316:17:2316:34 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2316:30:2316:33 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2317:13:2317:13 | z | | {EXTERNAL LOCATION} | i64 | +| main.rs:2317:22:2317:43 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2317:38:2317:42 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2318:9:2318:34 | ...::my_from2(...) | | file://:0:0:0:0 | () | +| main.rs:2318:23:2318:27 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2318:30:2318:33 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2319:9:2319:33 | ...::my_from2(...) | | file://:0:0:0:0 | () | +| main.rs:2319:23:2319:26 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2319:29:2319:32 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2320:9:2320:38 | ...::my_from2(...) | | file://:0:0:0:0 | () | +| main.rs:2320:27:2320:31 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2320:34:2320:37 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2322:9:2322:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2322:17:2322:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2323:9:2323:22 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2323:17:2323:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2324:9:2324:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2324:18:2324:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2325:9:2325:22 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2325:18:2325:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2326:9:2326:30 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2326:25:2326:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2327:9:2327:30 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2327:25:2327:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2328:9:2328:29 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2328:25:2328:28 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2329:9:2329:29 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2329:25:2329:28 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2337:26:2339:9 | { ... } | | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2338:13:2338:25 | MyCallable {...} | | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2341:17:2341:21 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2341:17:2341:21 | SelfParam | &T | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2341:31:2343:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2342:13:2342:13 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2342:13:2342:13 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2349:13:2349:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2349:18:2349:26 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2349:18:2349:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2349:19:2349:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2349:22:2349:22 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2349:25:2349:25 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2350:18:2350:26 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2350:18:2350:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2350:18:2350:41 | ... .map(...) | | file://:0:0:0:0 | [] | +| main.rs:2350:19:2350:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2350:22:2350:22 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2350:25:2350:25 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2350:32:2350:40 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| main.rs:2350:32:2350:40 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | +| main.rs:2350:40:2350:40 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2351:13:2351:13 | i | | {EXTERNAL LOCATION} | Item | +| main.rs:2351:13:2351:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2351:18:2351:26 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2351:18:2351:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2351:18:2351:38 | ... .into_iter() | | {EXTERNAL LOCATION} | IntoIter | +| main.rs:2351:18:2351:38 | ... .into_iter() | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2351:19:2351:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2351:22:2351:22 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2351:25:2351:25 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2353:13:2353:17 | vals1 | | file://:0:0:0:0 | [] | +| main.rs:2353:13:2353:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2353:13:2353:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | +| main.rs:2353:21:2353:31 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2353:21:2353:31 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2353:21:2353:31 | [...] | [T;...] | {EXTERNAL LOCATION} | u8 | +| main.rs:2353:22:2353:24 | 1u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2353:27:2353:27 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2353:27:2353:27 | 2 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2353:30:2353:30 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2353:30:2353:30 | 3 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2354:13:2354:13 | u | | {EXTERNAL LOCATION} | i32 | +| main.rs:2354:13:2354:13 | u | | {EXTERNAL LOCATION} | u8 | +| main.rs:2354:18:2354:22 | vals1 | | file://:0:0:0:0 | [] | +| main.rs:2354:18:2354:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2354:18:2354:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | +| main.rs:2356:13:2356:17 | vals2 | | file://:0:0:0:0 | [] | +| main.rs:2356:13:2356:17 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2356:21:2356:29 | [1u16; 3] | | file://:0:0:0:0 | [] | +| main.rs:2356:21:2356:29 | [1u16; 3] | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2356:22:2356:25 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2356:28:2356:28 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2357:13:2357:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2357:18:2357:22 | vals2 | | file://:0:0:0:0 | [] | +| main.rs:2357:18:2357:22 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2359:13:2359:17 | vals3 | | file://:0:0:0:0 | [] | +| main.rs:2359:13:2359:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | +| main.rs:2359:26:2359:26 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2359:31:2359:39 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2359:31:2359:39 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2359:31:2359:39 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | +| main.rs:2359:32:2359:32 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2359:32:2359:32 | 1 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2359:35:2359:35 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2359:35:2359:35 | 2 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2359:38:2359:38 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2359:38:2359:38 | 3 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2360:13:2360:13 | u | | {EXTERNAL LOCATION} | u32 | +| main.rs:2360:18:2360:22 | vals3 | | file://:0:0:0:0 | [] | +| main.rs:2360:18:2360:22 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | +| main.rs:2362:13:2362:17 | vals4 | | file://:0:0:0:0 | [] | +| main.rs:2362:13:2362:17 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | +| main.rs:2362:26:2362:26 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2362:31:2362:36 | [1; 3] | | file://:0:0:0:0 | [] | +| main.rs:2362:31:2362:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2362:31:2362:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | u64 | +| main.rs:2362:32:2362:32 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2362:32:2362:32 | 1 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2362:35:2362:35 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2363:13:2363:13 | u | | {EXTERNAL LOCATION} | u64 | +| main.rs:2363:18:2363:22 | vals4 | | file://:0:0:0:0 | [] | +| main.rs:2363:18:2363:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | +| main.rs:2365:17:2365:24 | strings1 | | file://:0:0:0:0 | [] | +| main.rs:2365:17:2365:24 | strings1 | [T;...] | file://:0:0:0:0 | & | +| main.rs:2365:17:2365:24 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2365:28:2365:48 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2365:28:2365:48 | [...] | [T;...] | file://:0:0:0:0 | & | +| main.rs:2365:28:2365:48 | [...] | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2365:29:2365:33 | "foo" | | file://:0:0:0:0 | & | +| main.rs:2365:29:2365:33 | "foo" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2365:36:2365:40 | "bar" | | file://:0:0:0:0 | & | +| main.rs:2365:36:2365:40 | "bar" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2365:43:2365:47 | "baz" | | file://:0:0:0:0 | & | +| main.rs:2365:43:2365:47 | "baz" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2366:13:2366:13 | s | | {EXTERNAL LOCATION} | Item | +| main.rs:2366:13:2366:13 | s | | file://:0:0:0:0 | & | +| main.rs:2366:13:2366:13 | s | &T | file://:0:0:0:0 | & | +| main.rs:2366:13:2366:13 | s | &T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2366:18:2366:26 | &strings1 | | file://:0:0:0:0 | & | +| main.rs:2366:18:2366:26 | &strings1 | &T | file://:0:0:0:0 | [] | +| main.rs:2366:18:2366:26 | &strings1 | &T.[T;...] | file://:0:0:0:0 | & | +| main.rs:2366:18:2366:26 | &strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2366:19:2366:26 | strings1 | | file://:0:0:0:0 | [] | +| main.rs:2366:19:2366:26 | strings1 | [T;...] | file://:0:0:0:0 | & | +| main.rs:2366:19:2366:26 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2367:13:2367:13 | s | | {EXTERNAL LOCATION} | Item | +| main.rs:2367:13:2367:13 | s | | file://:0:0:0:0 | & | +| main.rs:2367:13:2367:13 | s | &T | file://:0:0:0:0 | & | +| main.rs:2367:13:2367:13 | s | &T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2367:18:2367:30 | &mut strings1 | | file://:0:0:0:0 | & | +| main.rs:2367:18:2367:30 | &mut strings1 | &T | file://:0:0:0:0 | [] | +| main.rs:2367:18:2367:30 | &mut strings1 | &T.[T;...] | file://:0:0:0:0 | & | +| main.rs:2367:18:2367:30 | &mut strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2367:23:2367:30 | strings1 | | file://:0:0:0:0 | [] | +| main.rs:2367:23:2367:30 | strings1 | [T;...] | file://:0:0:0:0 | & | +| main.rs:2367:23:2367:30 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2368:13:2368:13 | s | | file://:0:0:0:0 | & | +| main.rs:2368:13:2368:13 | s | &T | {EXTERNAL LOCATION} | str | +| main.rs:2368:18:2368:25 | strings1 | | file://:0:0:0:0 | [] | +| main.rs:2368:18:2368:25 | strings1 | [T;...] | file://:0:0:0:0 | & | +| main.rs:2368:18:2368:25 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2370:13:2370:20 | strings2 | | file://:0:0:0:0 | [] | +| main.rs:2370:13:2370:20 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2371:9:2375:9 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2371:9:2375:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2372:13:2372:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2372:26:2372:30 | "foo" | | file://:0:0:0:0 | & | +| main.rs:2372:26:2372:30 | "foo" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2373:13:2373:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2373:26:2373:30 | "bar" | | file://:0:0:0:0 | & | +| main.rs:2373:26:2373:30 | "bar" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2374:13:2374:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2374:26:2374:30 | "baz" | | file://:0:0:0:0 | & | +| main.rs:2374:26:2374:30 | "baz" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2376:13:2376:13 | s | | {EXTERNAL LOCATION} | String | +| main.rs:2376:18:2376:25 | strings2 | | file://:0:0:0:0 | [] | +| main.rs:2376:18:2376:25 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2378:13:2378:20 | strings3 | | file://:0:0:0:0 | & | +| main.rs:2378:13:2378:20 | strings3 | &T | file://:0:0:0:0 | [] | +| main.rs:2378:13:2378:20 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2379:9:2383:9 | &... | | file://:0:0:0:0 | & | +| main.rs:2379:9:2383:9 | &... | &T | file://:0:0:0:0 | [] | +| main.rs:2379:9:2383:9 | &... | &T.[T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2379:10:2383:9 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2379:10:2383:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2380:13:2380:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2380:26:2380:30 | "foo" | | file://:0:0:0:0 | & | +| main.rs:2380:26:2380:30 | "foo" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2381:13:2381:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2381:26:2381:30 | "bar" | | file://:0:0:0:0 | & | +| main.rs:2381:26:2381:30 | "bar" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2382:13:2382:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2382:26:2382:30 | "baz" | | file://:0:0:0:0 | & | +| main.rs:2382:26:2382:30 | "baz" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2384:13:2384:13 | s | | {EXTERNAL LOCATION} | Item | +| main.rs:2384:13:2384:13 | s | | file://:0:0:0:0 | & | +| main.rs:2384:13:2384:13 | s | &T | {EXTERNAL LOCATION} | String | +| main.rs:2384:18:2384:25 | strings3 | | file://:0:0:0:0 | & | +| main.rs:2384:18:2384:25 | strings3 | &T | file://:0:0:0:0 | [] | +| main.rs:2384:18:2384:25 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2386:13:2386:21 | callables | | file://:0:0:0:0 | [] | +| main.rs:2386:13:2386:21 | callables | [T;...] | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2386:25:2386:81 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2386:25:2386:81 | [...] | [T;...] | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2386:26:2386:42 | ...::new(...) | | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2386:45:2386:61 | ...::new(...) | | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2386:64:2386:80 | ...::new(...) | | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2387:13:2387:13 | c | | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2388:12:2388:20 | callables | | file://:0:0:0:0 | [] | +| main.rs:2388:12:2388:20 | callables | [T;...] | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2390:17:2390:22 | result | | {EXTERNAL LOCATION} | i64 | +| main.rs:2390:26:2390:26 | c | | main.rs:2334:5:2334:24 | MyCallable | +| main.rs:2390:26:2390:33 | c.call() | | {EXTERNAL LOCATION} | i64 | +| main.rs:2395:13:2395:13 | i | | {EXTERNAL LOCATION} | Item | +| main.rs:2395:13:2395:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2395:18:2395:18 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2395:18:2395:22 | 0..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2395:18:2395:22 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2395:21:2395:22 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2396:13:2396:13 | u | | {EXTERNAL LOCATION} | Range | +| main.rs:2396:13:2396:13 | u | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2396:13:2396:13 | u | Idx | {EXTERNAL LOCATION} | u8 | +| main.rs:2396:18:2396:26 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2396:18:2396:26 | [...] | [T;...] | {EXTERNAL LOCATION} | Range | +| main.rs:2396:18:2396:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2396:18:2396:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | u8 | +| main.rs:2396:19:2396:21 | 0u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2396:19:2396:25 | 0u8..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2396:19:2396:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2396:19:2396:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | u8 | +| main.rs:2396:24:2396:25 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2396:24:2396:25 | 10 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2397:13:2397:17 | range | | {EXTERNAL LOCATION} | Range | +| main.rs:2397:13:2397:17 | range | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2397:21:2397:21 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2397:21:2397:25 | 0..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2397:21:2397:25 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2397:24:2397:25 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2398:13:2398:13 | i | | {EXTERNAL LOCATION} | Item | +| main.rs:2398:13:2398:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2398:18:2398:22 | range | | {EXTERNAL LOCATION} | Range | +| main.rs:2398:18:2398:22 | range | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2399:13:2399:22 | range_full | | {EXTERNAL LOCATION} | RangeFull | +| main.rs:2399:26:2399:27 | .. | | {EXTERNAL LOCATION} | RangeFull | +| main.rs:2400:13:2400:13 | i | | {EXTERNAL LOCATION} | Item | +| main.rs:2400:18:2400:48 | &... | | file://:0:0:0:0 | & | +| main.rs:2400:19:2400:36 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2400:19:2400:36 | [...] | [T;...] | {EXTERNAL LOCATION} | i64 | +| main.rs:2400:20:2400:23 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2400:26:2400:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2400:32:2400:35 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2400:38:2400:47 | range_full | | {EXTERNAL LOCATION} | RangeFull | +| main.rs:2402:13:2402:18 | range1 | | {EXTERNAL LOCATION} | Range | +| main.rs:2402:13:2402:18 | range1 | Idx | {EXTERNAL LOCATION} | u16 | +| main.rs:2403:9:2406:9 | ...::Range {...} | | {EXTERNAL LOCATION} | Range | +| main.rs:2403:9:2406:9 | ...::Range {...} | Idx | {EXTERNAL LOCATION} | u16 | +| main.rs:2404:20:2404:23 | 0u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2405:18:2405:22 | 10u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2407:13:2407:13 | u | | {EXTERNAL LOCATION} | Item | +| main.rs:2407:13:2407:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2407:18:2407:23 | range1 | | {EXTERNAL LOCATION} | Range | +| main.rs:2407:18:2407:23 | range1 | Idx | {EXTERNAL LOCATION} | u16 | +| main.rs:2411:26:2411:26 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2411:29:2411:29 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2411:32:2411:32 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2414:13:2414:18 | vals4a | | {EXTERNAL LOCATION} | Vec | +| main.rs:2414:13:2414:18 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2414:13:2414:18 | vals4a | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2414:32:2414:43 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2414:32:2414:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2414:32:2414:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2414:32:2414:52 | ... .to_vec() | | {EXTERNAL LOCATION} | Vec | +| main.rs:2414:32:2414:52 | ... .to_vec() | A | {EXTERNAL LOCATION} | Global | +| main.rs:2414:32:2414:52 | ... .to_vec() | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2414:33:2414:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2414:39:2414:39 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2414:39:2414:39 | 2 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2414:42:2414:42 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2414:42:2414:42 | 3 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2415:13:2415:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2415:13:2415:13 | u | | file://:0:0:0:0 | & | +| main.rs:2415:18:2415:23 | vals4a | | {EXTERNAL LOCATION} | Vec | +| main.rs:2415:18:2415:23 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2415:18:2415:23 | vals4a | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2417:22:2417:33 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2417:22:2417:33 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2417:22:2417:33 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2417:23:2417:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2417:29:2417:29 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2417:29:2417:29 | 2 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2417:32:2417:32 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2417:32:2417:32 | 3 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2420:13:2420:17 | vals5 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2420:13:2420:17 | vals5 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2420:13:2420:17 | vals5 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2420:13:2420:17 | vals5 | T | {EXTERNAL LOCATION} | u32 | +| main.rs:2420:21:2420:43 | ...::from(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2420:21:2420:43 | ...::from(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2420:21:2420:43 | ...::from(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2420:21:2420:43 | ...::from(...) | T | {EXTERNAL LOCATION} | u32 | +| main.rs:2420:31:2420:42 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2420:31:2420:42 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2420:31:2420:42 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | +| main.rs:2420:32:2420:35 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2420:38:2420:38 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2420:38:2420:38 | 2 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2420:41:2420:41 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2420:41:2420:41 | 3 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2421:13:2421:13 | u | | {EXTERNAL LOCATION} | i32 | +| main.rs:2421:13:2421:13 | u | | {EXTERNAL LOCATION} | u32 | +| main.rs:2421:13:2421:13 | u | | file://:0:0:0:0 | & | +| main.rs:2421:18:2421:22 | vals5 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2421:18:2421:22 | vals5 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2421:18:2421:22 | vals5 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2421:18:2421:22 | vals5 | T | {EXTERNAL LOCATION} | u32 | +| main.rs:2423:13:2423:17 | vals6 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2423:13:2423:17 | vals6 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2423:13:2423:17 | vals6 | T | file://:0:0:0:0 | & | +| main.rs:2423:13:2423:17 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | +| main.rs:2423:32:2423:43 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2423:32:2423:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2423:32:2423:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u64 | +| main.rs:2423:32:2423:60 | ... .collect() | | {EXTERNAL LOCATION} | Vec | +| main.rs:2423:32:2423:60 | ... .collect() | A | {EXTERNAL LOCATION} | Global | +| main.rs:2423:32:2423:60 | ... .collect() | T | file://:0:0:0:0 | & | +| main.rs:2423:32:2423:60 | ... .collect() | T.&T | {EXTERNAL LOCATION} | u64 | +| main.rs:2423:33:2423:36 | 1u64 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2423:39:2423:39 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2423:39:2423:39 | 2 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2423:42:2423:42 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2423:42:2423:42 | 3 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2424:13:2424:13 | u | | file://:0:0:0:0 | & | +| main.rs:2424:13:2424:13 | u | &T | {EXTERNAL LOCATION} | u64 | +| main.rs:2424:18:2424:22 | vals6 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2424:18:2424:22 | vals6 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2424:18:2424:22 | vals6 | T | file://:0:0:0:0 | & | +| main.rs:2424:18:2424:22 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | +| main.rs:2426:17:2426:21 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2426:17:2426:21 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2426:17:2426:21 | vals7 | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2426:25:2426:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2426:25:2426:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2426:25:2426:34 | ...::new(...) | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2427:9:2427:13 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2427:9:2427:13 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2427:9:2427:13 | vals7 | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2427:20:2427:22 | 1u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2428:13:2428:13 | u | | {EXTERNAL LOCATION} | u8 | +| main.rs:2428:13:2428:13 | u | | file://:0:0:0:0 | & | +| main.rs:2428:18:2428:22 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2428:18:2428:22 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2428:18:2428:22 | vals7 | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2430:33:2430:33 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2430:36:2430:36 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2430:45:2430:45 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2430:48:2430:48 | 4 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2437:17:2437:20 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2437:17:2437:20 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2437:17:2437:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2437:17:2437:20 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2437:17:2437:20 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2437:17:2437:20 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2437:17:2437:20 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2437:24:2437:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2437:24:2437:55 | ...::new(...) | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2437:24:2437:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2437:24:2437:55 | ...::new(...) | V | {EXTERNAL LOCATION} | Box | +| main.rs:2437:24:2437:55 | ...::new(...) | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2437:24:2437:55 | ...::new(...) | V.T | file://:0:0:0:0 | & | +| main.rs:2437:24:2437:55 | ...::new(...) | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2438:9:2438:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2438:9:2438:12 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2438:9:2438:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2438:9:2438:12 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2438:9:2438:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2438:9:2438:12 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2438:9:2438:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2438:9:2438:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2438:9:2438:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | +| main.rs:2438:9:2438:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2438:9:2438:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | +| main.rs:2438:9:2438:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2438:21:2438:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2438:24:2438:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2438:24:2438:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2438:24:2438:38 | ...::new(...) | T | file://:0:0:0:0 | & | +| main.rs:2438:24:2438:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2438:33:2438:37 | "one" | | file://:0:0:0:0 | & | +| main.rs:2438:33:2438:37 | "one" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2439:9:2439:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2439:9:2439:12 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2439:9:2439:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2439:9:2439:12 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2439:9:2439:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2439:9:2439:12 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2439:9:2439:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2439:9:2439:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2439:9:2439:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | +| main.rs:2439:9:2439:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2439:9:2439:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | +| main.rs:2439:9:2439:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2439:21:2439:21 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2439:24:2439:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2439:24:2439:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2439:24:2439:38 | ...::new(...) | T | file://:0:0:0:0 | & | +| main.rs:2439:24:2439:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2439:33:2439:37 | "two" | | file://:0:0:0:0 | & | +| main.rs:2439:33:2439:37 | "two" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2440:13:2440:15 | key | | {EXTERNAL LOCATION} | Item | +| main.rs:2440:13:2440:15 | key | | file://:0:0:0:0 | & | +| main.rs:2440:13:2440:15 | key | &T | {EXTERNAL LOCATION} | i32 | +| main.rs:2440:20:2440:23 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2440:20:2440:23 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2440:20:2440:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2440:20:2440:23 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2440:20:2440:23 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2440:20:2440:23 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2440:20:2440:23 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2440:20:2440:30 | map1.keys() | | {EXTERNAL LOCATION} | Keys | +| main.rs:2440:20:2440:30 | map1.keys() | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2440:20:2440:30 | map1.keys() | V | {EXTERNAL LOCATION} | Box | +| main.rs:2440:20:2440:30 | map1.keys() | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2440:20:2440:30 | map1.keys() | V.T | file://:0:0:0:0 | & | +| main.rs:2440:20:2440:30 | map1.keys() | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2441:13:2441:17 | value | | {EXTERNAL LOCATION} | Item | +| main.rs:2441:13:2441:17 | value | | file://:0:0:0:0 | & | +| main.rs:2441:13:2441:17 | value | &T | {EXTERNAL LOCATION} | Box | +| main.rs:2441:13:2441:17 | value | &T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2441:13:2441:17 | value | &T.T | file://:0:0:0:0 | & | +| main.rs:2441:13:2441:17 | value | &T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2441:22:2441:25 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2441:22:2441:25 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2441:22:2441:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2441:22:2441:25 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2441:22:2441:25 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2441:22:2441:25 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2441:22:2441:25 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2441:22:2441:34 | map1.values() | | {EXTERNAL LOCATION} | Values | +| main.rs:2441:22:2441:34 | map1.values() | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2441:22:2441:34 | map1.values() | V | {EXTERNAL LOCATION} | Box | +| main.rs:2441:22:2441:34 | map1.values() | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2441:22:2441:34 | map1.values() | V.T | file://:0:0:0:0 | & | +| main.rs:2441:22:2441:34 | map1.values() | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2442:13:2442:24 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2442:13:2442:24 | TuplePat | 0(2) | file://:0:0:0:0 | & | +| main.rs:2442:13:2442:24 | TuplePat | 0(2).&T | {EXTERNAL LOCATION} | i32 | +| main.rs:2442:13:2442:24 | TuplePat | 1(2) | file://:0:0:0:0 | & | +| main.rs:2442:13:2442:24 | TuplePat | 1(2).&T | {EXTERNAL LOCATION} | Box | +| main.rs:2442:13:2442:24 | TuplePat | 1(2).&T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2442:13:2442:24 | TuplePat | 1(2).&T.T | file://:0:0:0:0 | & | +| main.rs:2442:13:2442:24 | TuplePat | 1(2).&T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2442:14:2442:16 | key | | file://:0:0:0:0 | & | +| main.rs:2442:14:2442:16 | key | &T | {EXTERNAL LOCATION} | i32 | +| main.rs:2442:19:2442:23 | value | | file://:0:0:0:0 | & | +| main.rs:2442:19:2442:23 | value | &T | {EXTERNAL LOCATION} | Box | +| main.rs:2442:19:2442:23 | value | &T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2442:19:2442:23 | value | &T.T | file://:0:0:0:0 | & | +| main.rs:2442:19:2442:23 | value | &T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2442:29:2442:32 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2442:29:2442:32 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2442:29:2442:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2442:29:2442:32 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2442:29:2442:32 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2442:29:2442:32 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2442:29:2442:32 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2442:29:2442:39 | map1.iter() | | {EXTERNAL LOCATION} | Iter | +| main.rs:2442:29:2442:39 | map1.iter() | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2442:29:2442:39 | map1.iter() | V | {EXTERNAL LOCATION} | Box | +| main.rs:2442:29:2442:39 | map1.iter() | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2442:29:2442:39 | map1.iter() | V.T | file://:0:0:0:0 | & | +| main.rs:2442:29:2442:39 | map1.iter() | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2443:13:2443:24 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2443:13:2443:24 | TuplePat | 0(2) | file://:0:0:0:0 | & | +| main.rs:2443:13:2443:24 | TuplePat | 0(2).&T | {EXTERNAL LOCATION} | i32 | +| main.rs:2443:13:2443:24 | TuplePat | 1(2) | file://:0:0:0:0 | & | +| main.rs:2443:13:2443:24 | TuplePat | 1(2).&T | {EXTERNAL LOCATION} | Box | +| main.rs:2443:13:2443:24 | TuplePat | 1(2).&T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2443:13:2443:24 | TuplePat | 1(2).&T.T | file://:0:0:0:0 | & | +| main.rs:2443:13:2443:24 | TuplePat | 1(2).&T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2443:14:2443:16 | key | | file://:0:0:0:0 | & | +| main.rs:2443:14:2443:16 | key | &T | {EXTERNAL LOCATION} | i32 | +| main.rs:2443:19:2443:23 | value | | file://:0:0:0:0 | & | +| main.rs:2443:19:2443:23 | value | &T | {EXTERNAL LOCATION} | Box | +| main.rs:2443:19:2443:23 | value | &T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2443:19:2443:23 | value | &T.T | file://:0:0:0:0 | & | +| main.rs:2443:19:2443:23 | value | &T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2443:29:2443:33 | &map1 | | file://:0:0:0:0 | & | +| main.rs:2443:29:2443:33 | &map1 | &T | {EXTERNAL LOCATION} | HashMap | +| main.rs:2443:29:2443:33 | &map1 | &T.K | {EXTERNAL LOCATION} | i32 | +| main.rs:2443:29:2443:33 | &map1 | &T.S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2443:29:2443:33 | &map1 | &T.V | {EXTERNAL LOCATION} | Box | +| main.rs:2443:29:2443:33 | &map1 | &T.V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2443:29:2443:33 | &map1 | &T.V.T | file://:0:0:0:0 | & | +| main.rs:2443:29:2443:33 | &map1 | &T.V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2443:30:2443:33 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2443:30:2443:33 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2443:30:2443:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2443:30:2443:33 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2443:30:2443:33 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2443:30:2443:33 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2443:30:2443:33 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2447:17:2447:17 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2447:26:2447:26 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2447:26:2447:26 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2449:23:2449:23 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2449:23:2449:28 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2449:27:2449:28 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2449:27:2449:28 | 10 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2451:13:2451:13 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2451:13:2451:18 | ... += ... | | file://:0:0:0:0 | () | +| main.rs:2451:18:2451:18 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2463:40:2465:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2463:40:2465:9 | { ... } | T | main.rs:2457:5:2457:20 | S1 | +| main.rs:2463:40:2465:9 | { ... } | T.T | main.rs:2462:10:2462:19 | T | +| main.rs:2464:13:2464:16 | None | | {EXTERNAL LOCATION} | Option | +| main.rs:2464:13:2464:16 | None | T | main.rs:2457:5:2457:20 | S1 | +| main.rs:2464:13:2464:16 | None | T.T | main.rs:2462:10:2462:19 | T | +| main.rs:2467:30:2469:9 | { ... } | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2467:30:2469:9 | { ... } | T | main.rs:2462:10:2462:19 | T | +| main.rs:2468:13:2468:28 | S1(...) | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2468:13:2468:28 | S1(...) | T | main.rs:2462:10:2462:19 | T | +| main.rs:2468:16:2468:27 | ...::default(...) | | main.rs:2462:10:2462:19 | T | +| main.rs:2471:19:2471:22 | SelfParam | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2471:19:2471:22 | SelfParam | T | main.rs:2462:10:2462:19 | T | +| main.rs:2471:33:2473:9 | { ... } | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2471:33:2473:9 | { ... } | T | main.rs:2462:10:2462:19 | T | +| main.rs:2472:13:2472:16 | self | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2472:13:2472:16 | self | T | main.rs:2462:10:2462:19 | T | +| main.rs:2484:15:2484:15 | x | | main.rs:2484:12:2484:12 | T | +| main.rs:2484:26:2486:5 | { ... } | | main.rs:2484:12:2484:12 | T | +| main.rs:2485:9:2485:9 | x | | main.rs:2484:12:2484:12 | T | +| main.rs:2489:13:2489:14 | x1 | | {EXTERNAL LOCATION} | Option | +| main.rs:2489:13:2489:14 | x1 | T | main.rs:2457:5:2457:20 | S1 | +| main.rs:2489:13:2489:14 | x1 | T.T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2489:34:2489:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2489:34:2489:48 | ...::assoc_fun(...) | T | main.rs:2457:5:2457:20 | S1 | +| main.rs:2489:34:2489:48 | ...::assoc_fun(...) | T.T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2490:13:2490:14 | x2 | | {EXTERNAL LOCATION} | Option | +| main.rs:2490:13:2490:14 | x2 | T | main.rs:2457:5:2457:20 | S1 | +| main.rs:2490:13:2490:14 | x2 | T.T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2490:18:2490:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2490:18:2490:38 | ...::assoc_fun(...) | T | main.rs:2457:5:2457:20 | S1 | +| main.rs:2490:18:2490:38 | ...::assoc_fun(...) | T.T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2491:13:2491:14 | x3 | | {EXTERNAL LOCATION} | Option | +| main.rs:2491:13:2491:14 | x3 | T | main.rs:2457:5:2457:20 | S1 | +| main.rs:2491:13:2491:14 | x3 | T.T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2491:18:2491:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2491:18:2491:32 | ...::assoc_fun(...) | T | main.rs:2457:5:2457:20 | S1 | +| main.rs:2491:18:2491:32 | ...::assoc_fun(...) | T.T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2492:13:2492:14 | x4 | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2492:13:2492:14 | x4 | T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2492:18:2492:48 | ...::method(...) | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2492:18:2492:48 | ...::method(...) | T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2492:35:2492:47 | ...::default(...) | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2492:35:2492:47 | ...::default(...) | T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2493:13:2493:14 | x5 | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2493:13:2493:14 | x5 | T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2493:18:2493:42 | ...::method(...) | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2493:18:2493:42 | ...::method(...) | T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2493:29:2493:41 | ...::default(...) | | main.rs:2457:5:2457:20 | S1 | +| main.rs:2493:29:2493:41 | ...::default(...) | T | main.rs:2459:5:2460:14 | S2 | +| main.rs:2494:13:2494:14 | x6 | | main.rs:2478:5:2478:27 | S4 | +| main.rs:2494:13:2494:14 | x6 | T4 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2494:18:2494:45 | S4::<...>(...) | | main.rs:2478:5:2478:27 | S4 | +| main.rs:2494:18:2494:45 | S4::<...>(...) | T4 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2494:27:2494:44 | ...::default(...) | | main.rs:2459:5:2460:14 | S2 | +| main.rs:2495:13:2495:14 | x7 | | main.rs:2478:5:2478:27 | S4 | +| main.rs:2495:13:2495:14 | x7 | T4 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2495:18:2495:23 | S4(...) | | main.rs:2478:5:2478:27 | S4 | +| main.rs:2495:18:2495:23 | S4(...) | T4 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2495:21:2495:22 | S2 | | main.rs:2459:5:2460:14 | S2 | +| main.rs:2496:13:2496:14 | x8 | | main.rs:2478:5:2478:27 | S4 | +| main.rs:2496:13:2496:14 | x8 | T4 | {EXTERNAL LOCATION} | i32 | +| main.rs:2496:18:2496:22 | S4(...) | | main.rs:2478:5:2478:27 | S4 | +| main.rs:2496:18:2496:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 | +| main.rs:2496:21:2496:21 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2497:13:2497:14 | x9 | | main.rs:2478:5:2478:27 | S4 | +| main.rs:2497:13:2497:14 | x9 | T4 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2497:18:2497:34 | S4(...) | | main.rs:2478:5:2478:27 | S4 | +| main.rs:2497:18:2497:34 | S4(...) | T4 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2497:21:2497:33 | ...::default(...) | | main.rs:2459:5:2460:14 | S2 | +| main.rs:2498:13:2498:15 | x10 | | main.rs:2480:5:2482:5 | S5 | +| main.rs:2498:13:2498:15 | x10 | T5 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2498:19:2501:9 | S5::<...> {...} | | main.rs:2480:5:2482:5 | S5 | +| main.rs:2498:19:2501:9 | S5::<...> {...} | T5 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2500:20:2500:37 | ...::default(...) | | main.rs:2459:5:2460:14 | S2 | +| main.rs:2502:13:2502:15 | x11 | | main.rs:2480:5:2482:5 | S5 | +| main.rs:2502:13:2502:15 | x11 | T5 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2502:19:2502:34 | S5 {...} | | main.rs:2480:5:2482:5 | S5 | +| main.rs:2502:19:2502:34 | S5 {...} | T5 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2502:31:2502:32 | S2 | | main.rs:2459:5:2460:14 | S2 | +| main.rs:2503:13:2503:15 | x12 | | main.rs:2480:5:2482:5 | S5 | +| main.rs:2503:13:2503:15 | x12 | T5 | {EXTERNAL LOCATION} | i32 | +| main.rs:2503:19:2503:33 | S5 {...} | | main.rs:2480:5:2482:5 | S5 | +| main.rs:2503:19:2503:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 | +| main.rs:2503:31:2503:31 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2504:13:2504:15 | x13 | | main.rs:2480:5:2482:5 | S5 | +| main.rs:2504:13:2504:15 | x13 | T5 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2504:19:2507:9 | S5 {...} | | main.rs:2480:5:2482:5 | S5 | +| main.rs:2504:19:2507:9 | S5 {...} | T5 | main.rs:2459:5:2460:14 | S2 | +| main.rs:2506:20:2506:32 | ...::default(...) | | main.rs:2459:5:2460:14 | S2 | +| main.rs:2508:13:2508:15 | x14 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2508:19:2508:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:2508:30:2508:47 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:2517:35:2519:9 | { ... } | | file://:0:0:0:0 | (T_2) | +| main.rs:2517:35:2519:9 | { ... } | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2517:35:2519:9 | { ... } | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2518:13:2518:26 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| main.rs:2518:13:2518:26 | TupleExpr | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2518:13:2518:26 | TupleExpr | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2518:14:2518:18 | S1 {...} | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2518:21:2518:25 | S1 {...} | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2520:16:2520:19 | SelfParam | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2524:13:2524:13 | a | | file://:0:0:0:0 | (T_2) | +| main.rs:2524:13:2524:13 | a | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2524:13:2524:13 | a | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2524:17:2524:30 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2524:17:2524:30 | ...::get_pair(...) | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2524:17:2524:30 | ...::get_pair(...) | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2525:17:2525:17 | b | | file://:0:0:0:0 | (T_2) | +| main.rs:2525:17:2525:17 | b | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2525:17:2525:17 | b | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2525:21:2525:34 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2525:21:2525:34 | ...::get_pair(...) | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2525:21:2525:34 | ...::get_pair(...) | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2526:13:2526:18 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2526:13:2526:18 | TuplePat | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2526:13:2526:18 | TuplePat | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2526:14:2526:14 | c | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2526:17:2526:17 | d | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2526:22:2526:35 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2526:22:2526:35 | ...::get_pair(...) | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2526:22:2526:35 | ...::get_pair(...) | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2527:13:2527:22 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2527:13:2527:22 | TuplePat | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2527:13:2527:22 | TuplePat | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2527:18:2527:18 | e | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2527:21:2527:21 | f | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2527:26:2527:39 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2527:26:2527:39 | ...::get_pair(...) | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2527:26:2527:39 | ...::get_pair(...) | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2528:13:2528:26 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2528:13:2528:26 | TuplePat | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2528:13:2528:26 | TuplePat | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2528:18:2528:18 | g | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2528:25:2528:25 | h | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2528:30:2528:43 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2528:30:2528:43 | ...::get_pair(...) | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2528:30:2528:43 | ...::get_pair(...) | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2530:9:2530:9 | a | | file://:0:0:0:0 | (T_2) | +| main.rs:2530:9:2530:9 | a | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2530:9:2530:9 | a | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2530:9:2530:11 | a.0 | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2531:9:2531:9 | b | | file://:0:0:0:0 | (T_2) | +| main.rs:2531:9:2531:9 | b | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2531:9:2531:9 | b | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2531:9:2531:11 | b.1 | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2532:9:2532:9 | c | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2533:9:2533:9 | d | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2534:9:2534:9 | e | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2535:9:2535:9 | f | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2536:9:2536:9 | g | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2537:9:2537:9 | h | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2542:13:2542:13 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2542:17:2542:34 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2543:13:2543:13 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2543:17:2543:34 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2544:13:2544:16 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2544:13:2544:16 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | +| main.rs:2544:13:2544:16 | pair | 1(2) | {EXTERNAL LOCATION} | bool | +| main.rs:2544:20:2544:25 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| main.rs:2544:20:2544:25 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i64 | +| main.rs:2544:20:2544:25 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | bool | +| main.rs:2544:21:2544:21 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2544:24:2544:24 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2545:13:2545:13 | i | | {EXTERNAL LOCATION} | i64 | +| main.rs:2545:22:2545:25 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2545:22:2545:25 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | +| main.rs:2545:22:2545:25 | pair | 1(2) | {EXTERNAL LOCATION} | bool | +| main.rs:2545:22:2545:27 | pair.0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2546:13:2546:13 | j | | {EXTERNAL LOCATION} | bool | +| main.rs:2546:23:2546:26 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2546:23:2546:26 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | +| main.rs:2546:23:2546:26 | pair | 1(2) | {EXTERNAL LOCATION} | bool | +| main.rs:2546:23:2546:28 | pair.1 | | {EXTERNAL LOCATION} | bool | +| main.rs:2548:13:2548:16 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2548:13:2548:16 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2548:13:2548:16 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2548:20:2548:25 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2548:20:2548:25 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2548:20:2548:32 | ... .into() | | file://:0:0:0:0 | (T_2) | +| main.rs:2548:20:2548:32 | ... .into() | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2548:20:2548:32 | ... .into() | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2548:21:2548:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2548:24:2548:24 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2549:15:2549:18 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2549:15:2549:18 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2549:15:2549:18 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2550:13:2550:18 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2550:13:2550:18 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2550:13:2550:18 | TuplePat | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2550:14:2550:14 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2550:17:2550:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2550:30:2550:41 | "unexpected" | | file://:0:0:0:0 | & | +| main.rs:2550:30:2550:41 | "unexpected" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2550:30:2550:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2550:30:2550:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2551:13:2551:13 | _ | | file://:0:0:0:0 | (T_2) | +| main.rs:2551:13:2551:13 | _ | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2551:13:2551:13 | _ | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2551:25:2551:34 | "expected" | | file://:0:0:0:0 | & | +| main.rs:2551:25:2551:34 | "expected" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2551:25:2551:34 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2551:25:2551:34 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2553:13:2553:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:2553:17:2553:20 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2553:17:2553:20 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2553:17:2553:20 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2553:17:2553:22 | pair.0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2555:13:2555:13 | y | | file://:0:0:0:0 | & | +| main.rs:2555:13:2555:13 | y | &T | file://:0:0:0:0 | (T_2) | +| main.rs:2555:13:2555:13 | y | &T.0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2555:13:2555:13 | y | &T.1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2555:17:2555:31 | &... | | file://:0:0:0:0 | & | +| main.rs:2555:17:2555:31 | &... | &T | file://:0:0:0:0 | (T_2) | +| main.rs:2555:17:2555:31 | &... | &T.0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2555:17:2555:31 | &... | &T.1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2555:18:2555:31 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2555:18:2555:31 | ...::get_pair(...) | 0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2555:18:2555:31 | ...::get_pair(...) | 1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2556:9:2556:9 | y | | file://:0:0:0:0 | & | +| main.rs:2556:9:2556:9 | y | &T | file://:0:0:0:0 | (T_2) | +| main.rs:2556:9:2556:9 | y | &T.0(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2556:9:2556:9 | y | &T.1(2) | main.rs:2513:5:2514:16 | S1 | +| main.rs:2556:9:2556:11 | y.0 | | main.rs:2513:5:2514:16 | S1 | +| main.rs:2563:13:2563:23 | boxed_value | | {EXTERNAL LOCATION} | Box | +| main.rs:2563:13:2563:23 | boxed_value | A | {EXTERNAL LOCATION} | Global | +| main.rs:2563:13:2563:23 | boxed_value | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2563:27:2563:42 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2563:27:2563:42 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2563:27:2563:42 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2563:36:2563:41 | 100i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2566:15:2566:25 | boxed_value | | {EXTERNAL LOCATION} | Box | +| main.rs:2566:15:2566:25 | boxed_value | A | {EXTERNAL LOCATION} | Global | +| main.rs:2566:15:2566:25 | boxed_value | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2567:13:2567:19 | box 100 | | {EXTERNAL LOCATION} | Box | +| main.rs:2567:13:2567:19 | box 100 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2567:13:2567:19 | box 100 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2567:17:2567:19 | 100 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2568:26:2568:36 | "Boxed 100\\n" | | file://:0:0:0:0 | & | +| main.rs:2568:26:2568:36 | "Boxed 100\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2568:26:2568:36 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2568:26:2568:36 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2570:13:2570:17 | box ... | | {EXTERNAL LOCATION} | Box | +| main.rs:2570:13:2570:17 | box ... | A | {EXTERNAL LOCATION} | Global | +| main.rs:2570:13:2570:17 | box ... | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2572:26:2572:42 | "Boxed value: {}\\n" | | file://:0:0:0:0 | & | +| main.rs:2572:26:2572:42 | "Boxed value: {}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2572:26:2572:51 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2572:26:2572:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2577:13:2577:22 | nested_box | | {EXTERNAL LOCATION} | Box | +| main.rs:2577:13:2577:22 | nested_box | A | {EXTERNAL LOCATION} | Global | +| main.rs:2577:13:2577:22 | nested_box | T | {EXTERNAL LOCATION} | Box | +| main.rs:2577:13:2577:22 | nested_box | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2577:13:2577:22 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2577:26:2577:50 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2577:26:2577:50 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2577:26:2577:50 | ...::new(...) | T | {EXTERNAL LOCATION} | Box | +| main.rs:2577:26:2577:50 | ...::new(...) | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2577:26:2577:50 | ...::new(...) | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2577:35:2577:49 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2577:35:2577:49 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2577:35:2577:49 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2577:44:2577:48 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2578:15:2578:24 | nested_box | | {EXTERNAL LOCATION} | Box | +| main.rs:2578:15:2578:24 | nested_box | A | {EXTERNAL LOCATION} | Global | +| main.rs:2578:15:2578:24 | nested_box | T | {EXTERNAL LOCATION} | Box | +| main.rs:2578:15:2578:24 | nested_box | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2578:15:2578:24 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2579:13:2579:21 | box ... | | {EXTERNAL LOCATION} | Box | +| main.rs:2579:13:2579:21 | box ... | A | {EXTERNAL LOCATION} | Global | +| main.rs:2579:13:2579:21 | box ... | T | {EXTERNAL LOCATION} | Box | +| main.rs:2579:13:2579:21 | box ... | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2579:13:2579:21 | box ... | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2581:26:2581:43 | "Nested boxed: {}\\n" | | file://:0:0:0:0 | & | +| main.rs:2581:26:2581:43 | "Nested boxed: {}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2581:26:2581:59 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2581:26:2581:59 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2593:21:2593:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2593:21:2593:25 | SelfParam | &T | main.rs:2592:5:2595:5 | Self [trait Executor] | +| main.rs:2594:24:2594:28 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2594:24:2594:28 | SelfParam | &T | main.rs:2592:5:2595:5 | Self [trait Executor] | +| main.rs:2594:31:2594:35 | query | | main.rs:2594:21:2594:21 | E | +| main.rs:2598:21:2598:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2598:21:2598:25 | SelfParam | &T | main.rs:2597:10:2597:22 | T | +| main.rs:2599:22:2599:41 | "Executor::execute1\\n" | | file://:0:0:0:0 | & | +| main.rs:2599:22:2599:41 | "Executor::execute1\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2599:22:2599:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2599:22:2599:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2602:24:2602:28 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2602:24:2602:28 | SelfParam | &T | main.rs:2597:10:2597:22 | T | +| main.rs:2602:31:2602:36 | _query | | main.rs:2602:21:2602:21 | E | +| main.rs:2603:22:2603:41 | "Executor::execute2\\n" | | file://:0:0:0:0 | & | +| main.rs:2603:22:2603:41 | "Executor::execute2\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2603:22:2603:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2603:22:2603:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2612:13:2612:13 | c | | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2612:17:2612:34 | MySqlConnection {...} | | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2614:9:2614:9 | c | | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2615:35:2615:36 | &c | | file://:0:0:0:0 | & | +| main.rs:2615:35:2615:36 | &c | &T | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2615:36:2615:36 | c | | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2617:9:2617:9 | c | | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2617:20:2617:40 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| main.rs:2617:20:2617:40 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2618:9:2618:9 | c | | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2618:28:2618:48 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| main.rs:2618:28:2618:48 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2619:35:2619:36 | &c | | file://:0:0:0:0 | & | +| main.rs:2619:35:2619:36 | &c | &T | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2619:36:2619:36 | c | | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2619:39:2619:59 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| main.rs:2619:39:2619:59 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2620:43:2620:44 | &c | | file://:0:0:0:0 | & | +| main.rs:2620:43:2620:44 | &c | &T | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2620:44:2620:44 | c | | main.rs:2607:5:2607:29 | MySqlConnection | +| main.rs:2620:47:2620:67 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| main.rs:2620:47:2620:67 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2630:36:2632:9 | { ... } | | main.rs:2627:5:2627:22 | Path | +| main.rs:2631:13:2631:19 | Path {...} | | main.rs:2627:5:2627:22 | Path | +| main.rs:2634:29:2634:33 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2634:29:2634:33 | SelfParam | &T | main.rs:2627:5:2627:22 | Path | +| main.rs:2634:59:2636:9 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:2634:59:2636:9 | { ... } | E | file://:0:0:0:0 | () | +| main.rs:2634:59:2636:9 | { ... } | T | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2635:13:2635:30 | Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:2635:13:2635:30 | Ok(...) | E | file://:0:0:0:0 | () | +| main.rs:2635:13:2635:30 | Ok(...) | T | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2635:16:2635:29 | ...::new(...) | | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2642:39:2644:9 | { ... } | | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2643:13:2643:22 | PathBuf {...} | | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2652:18:2652:22 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2652:18:2652:22 | SelfParam | &T | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2652:34:2656:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:2652:34:2656:9 | { ... } | &T | main.rs:2627:5:2627:22 | Path | +| main.rs:2654:33:2654:43 | ...::new(...) | | main.rs:2627:5:2627:22 | Path | +| main.rs:2655:13:2655:17 | &path | | file://:0:0:0:0 | & | +| main.rs:2655:13:2655:17 | &path | &T | main.rs:2627:5:2627:22 | Path | +| main.rs:2655:14:2655:17 | path | | main.rs:2627:5:2627:22 | Path | +| main.rs:2660:13:2660:17 | path1 | | main.rs:2627:5:2627:22 | Path | +| main.rs:2660:21:2660:31 | ...::new(...) | | main.rs:2627:5:2627:22 | Path | +| main.rs:2661:13:2661:17 | path2 | | {EXTERNAL LOCATION} | Result | +| main.rs:2661:13:2661:17 | path2 | E | file://:0:0:0:0 | () | +| main.rs:2661:13:2661:17 | path2 | T | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2661:21:2661:25 | path1 | | main.rs:2627:5:2627:22 | Path | +| main.rs:2661:21:2661:40 | path1.canonicalize() | | {EXTERNAL LOCATION} | Result | +| main.rs:2661:21:2661:40 | path1.canonicalize() | E | file://:0:0:0:0 | () | +| main.rs:2661:21:2661:40 | path1.canonicalize() | T | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2662:13:2662:17 | path3 | | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2662:21:2662:25 | path2 | | {EXTERNAL LOCATION} | Result | +| main.rs:2662:21:2662:25 | path2 | E | file://:0:0:0:0 | () | +| main.rs:2662:21:2662:25 | path2 | T | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2662:21:2662:34 | path2.unwrap() | | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2664:13:2664:20 | pathbuf1 | | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2664:24:2664:37 | ...::new(...) | | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2665:24:2665:31 | pathbuf1 | | main.rs:2639:5:2639:25 | PathBuf | +| main.rs:2676:5:2676:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2677:5:2677:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2677:20:2677:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2677:41:2677:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2693:5:2693:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future | | pattern_matching.rs:13:26:133:1 | { ... } | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:13:26:133:1 | { ... } | T | file://:0:0:0:0 | () | | pattern_matching.rs:14:9:14:13 | value | | {EXTERNAL LOCATION} | Option | From 8cd0e06d88b8674e7bb7509891eca5a70cef57a9 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 18 Aug 2025 21:21:31 +0200 Subject: [PATCH 2/3] wip --- .../rust/elements/internal/OperationImpl.qll | 2 +- .../rust/elements/internal/UnionImpl.qll | 7 + .../codeql/rust/frameworks/stdlib/Stdlib.qll | 40 + .../codeql/rust/internal/PathResolution.qll | 6 +- rust/ql/lib/codeql/rust/internal/Type.qll | 64 +- .../codeql/rust/internal/TypeInference.qll | 2148 ++++++++++------- .../lib/codeql/rust/internal/TypeMention.qll | 84 + .../TypeInferenceConsistency.expected | 2 - .../PathResolutionConsistency.expected | 4 + .../type-inference/dereference.rs | 8 +- .../test/library-tests/type-inference/main.rs | 4 +- .../type-inference/type-inference.expected | 36 +- .../typeinference/internal/TypeInference.qll | 357 ++- 13 files changed, 1837 insertions(+), 925 deletions(-) delete mode 100644 rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/TypeInferenceConsistency.expected diff --git a/rust/ql/lib/codeql/rust/elements/internal/OperationImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/OperationImpl.qll index ea76293a1bd9..f22c95759d6e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/OperationImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/OperationImpl.qll @@ -12,7 +12,7 @@ private import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl * the canonical path `path` and the method name `method`, and if it borrows its * first `borrows` arguments. */ -private predicate isOverloaded(string op, int arity, string path, string method, int borrows) { +predicate isOverloaded(string op, int arity, string path, string method, int borrows) { arity = 1 and ( // Negation diff --git a/rust/ql/lib/codeql/rust/elements/internal/UnionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UnionImpl.qll index 17551c4834ed..712e39e6685e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UnionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UnionImpl.qll @@ -21,6 +21,13 @@ module Impl { * ``` */ class Union extends Generated::Union { + /** Gets the record field named `name`, if any. */ + pragma[nomagic] + StructField getStructField(string name) { + result = this.getStructFieldList().getAField() and + result.getName().getText() = name + } + override string toStringImpl() { result = "union " + this.getName().getText() } } } diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll b/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll index 728c632759cd..054d3ed936c0 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll @@ -213,3 +213,43 @@ class StringStruct extends Struct { pragma[nomagic] StringStruct() { this.getCanonicalPath() = "alloc::string::String" } } + +/** + * The [`Deref` trait][1]. + * + * [1]: https://doc.rust-lang.org/core/ops/trait.Deref.html + */ +class DerefTrait extends Trait { + pragma[nomagic] + DerefTrait() { this.getCanonicalPath() = "core::ops::deref::Deref" } + + /** Gets the `deref` function. */ + Function getDerefFunction() { result = this.(TraitItemNode).getAssocItem("deref") } + + /** Gets the `Target` associated type. */ + pragma[nomagic] + TypeAlias getTargetType() { + result = this.getAssocItemList().getAnAssocItem() and + result.getName().getText() = "Target" + } +} + +/** + * The [`Index` trait][1]. + * + * [1]: https://doc.rust-lang.org/std/ops/trait.Index.html + */ +class IndexTrait extends Trait { + pragma[nomagic] + IndexTrait() { this.getCanonicalPath() = "core::ops::index::Index" } + + /** Gets the `index` function. */ + Function getIndexFunction() { result = this.(TraitItemNode).getAssocItem("index") } + + /** Gets the `Output` associated type. */ + pragma[nomagic] + TypeAlias getOutputType() { + result = this.getAssocItemList().getAnAssocItem() and + result.getName().getText() = "Output" + } +} diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 77faaa747b96..d9988e0bd742 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -636,6 +636,8 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { TraitItemNode resolveTraitTy() { result = resolvePath(this.getTraitPath()) } + predicate isBlanket() { this.resolveSelfTy() instanceof TypeParam } + override AssocItemNode getAnAssocItem() { result = this.getADescendant() } override string getName() { result = "(impl)" } @@ -721,7 +723,7 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { } } -final private class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr { +final class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr { pragma[nomagic] Path getABoundPath() { result = super.getTypeBoundList().getABound().getTypeRepr().(PathTypeRepr).getPath() @@ -1740,7 +1742,7 @@ private module Debug { exists(string filepath, int startline, int startcolumn, int endline, int endcolumn | result.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) and filepath.matches("%/main.rs") and - startline = 52 + startline = 167 ) } diff --git a/rust/ql/lib/codeql/rust/internal/Type.qll b/rust/ql/lib/codeql/rust/internal/Type.qll index eaa7e83fc6da..29e6ed283bc6 100644 --- a/rust/ql/lib/codeql/rust/internal/Type.qll +++ b/rust/ql/lib/codeql/rust/internal/Type.qll @@ -42,11 +42,14 @@ newtype TType = TStruct(Struct s) or TEnum(Enum e) or TTrait(Trait t) or + TUnion(Union u) or TArrayType() or // todo: add size? TRefType() or // todo: add mut? TImplTraitType(ImplTraitTypeRepr impl) or TDynTraitType(Trait t) { t = any(DynTraitTypeRepr dt).getTrait() } or TSliceType() or + TNeverType() or + TPtrType() or TTupleTypeParameter(int arity, int i) { exists(TTuple(arity)) and i in [0 .. arity - 1] } or TTypeParamTypeParameter(TypeParam t) or TAssociatedTypeTypeParameter(TypeAlias t) { any(TraitItemNode trait).getAnAssocItem() = t } or @@ -57,7 +60,8 @@ newtype TType = } or TRefTypeParameter() or TSelfTypeParameter(Trait t) or - TSliceTypeParameter() + TSliceTypeParameter() or + TPtrTypeParameter() private predicate implTraitTypeParam(ImplTraitTypeRepr implTrait, int i, TypeParam tp) { implTrait.isInReturnPos() and @@ -224,6 +228,31 @@ class TraitType extends Type, TTrait { override Location getLocation() { result = trait.getLocation() } } +/** A union type. */ +class UnionType extends StructOrEnumType, TUnion { + private Union union; + + UnionType() { this = TUnion(union) } + + override ItemNode asItemNode() { result = union } + + override StructField getStructField(string name) { result = union.getStructField(name) } + + override TupleField getTupleField(int i) { none() } + + override TypeParameter getPositionalTypeParameter(int i) { + result = TTypeParamTypeParameter(union.getGenericParamList().getTypeParam(i)) + } + + override TypeMention getTypeParameterDefault(int i) { + result = union.getGenericParamList().getTypeParam(i).getDefaultType() + } + + override string toString() { result = union.getName().getText() } + + override Location getLocation() { result = union.getLocation() } +} + /** * An array type. * @@ -374,6 +403,33 @@ class SliceType extends Type, TSliceType { override Location getLocation() { result instanceof EmptyLocation } } +class NeverType extends Type, TNeverType { + override StructField getStructField(string name) { none() } + + override TupleField getTupleField(int i) { none() } + + override TypeParameter getPositionalTypeParameter(int i) { none() } + + override string toString() { result = "!" } + + override Location getLocation() { result instanceof EmptyLocation } +} + +class PtrType extends Type, TPtrType { + override StructField getStructField(string name) { none() } + + override TupleField getTupleField(int i) { none() } + + override TypeParameter getPositionalTypeParameter(int i) { + i = 0 and + result = TPtrTypeParameter() + } + + override string toString() { result = "*" } + + override Location getLocation() { result instanceof EmptyLocation } +} + /** A type parameter. */ abstract class TypeParameter extends Type { override StructField getStructField(string name) { none() } @@ -529,6 +585,12 @@ class SliceTypeParameter extends TypeParameter, TSliceTypeParameter { override Location getLocation() { result instanceof EmptyLocation } } +class PtrTypeParameter extends TypeParameter, TPtrTypeParameter { + override string toString() { result = "*T" } + + override Location getLocation() { result instanceof EmptyLocation } +} + /** * The implicit `Self` type parameter of a trait, that refers to the * implementing type of the trait. diff --git a/rust/ql/lib/codeql/rust/internal/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/TypeInference.qll index ade1a5514f61..340b8d6973dc 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeInference.qll @@ -99,6 +99,11 @@ private module Input1 implements InputSig1 { id1 = 0 and id2 = 2 or + tp0 instanceof PtrTypeParameter and + kind = 0 and + id1 = 0 and + id2 = 3 + or kind = 1 and id1 = 0 and id2 = @@ -266,7 +271,7 @@ module CertainTypeInference { pragma[nomagic] private Type getCallExprType( - CallExpr ce, Path p, CallExprBaseMatchingInput::FunctionDecl f, TypePath tp + CallExpr ce, Path p, FunctionCallMatchingInput::FunctionDecl f, TypePath tp ) { callResolvesTo(ce, p, f) and result = f.getReturnType(tp) @@ -304,7 +309,7 @@ module CertainTypeInference { // instantiation from the path. For instance, for `fn bar(a: A) -> A` // and the path `bar`, we must resolve `A` to `i64`. result = - ce.(CallExprBaseMatchingInput::Access) + ce.(FunctionCallMatchingInput::Access) .getTypeArgument(TTypeParamTypeArgumentPosition(tp), suffix) ) or @@ -602,50 +607,6 @@ private Type inferTypeEquality(AstNode n, TypePath path) { ) } -/** - * Gets the type of the implicitly typed `self` parameter, taking into account - * whether the parameter is passed by value or by reference. - */ -bindingset[self, suffix, t] -pragma[inline_late] -private Type getRefAdjustImplicitSelfType(SelfParam self, TypePath suffix, Type t, TypePath path) { - not self.hasTypeRepr() and - ( - if self.isRef() - then - // `fn f(&self, ...)` - path.isEmpty() and - result = TRefType() - or - path = TypePath::cons(TRefTypeParameter(), suffix) and - result = t - else ( - // `fn f(self, ...)` - path = suffix and - result = t - ) - ) -} - -pragma[nomagic] -private Type resolveImplSelfType(Impl i, TypePath path) { - result = i.getSelfTy().(TypeMention).resolveTypeAt(path) -} - -/** Gets the type at `path` of the implicitly typed `self` parameter. */ -pragma[nomagic] -private Type inferImplicitSelfType(SelfParam self, TypePath path) { - exists(ImplOrTraitItemNode i, Function f, TypePath suffix, Type t | - f = i.getAnAssocItem() and - self = f.getParamList().getSelfParam() and - result = getRefAdjustImplicitSelfType(self, suffix, t, path) - | - t = resolveImplSelfType(i, suffix) - or - t = TSelfTypeParameter(i) and suffix.isEmpty() - ) -} - /** * A matching configuration for resolving types of struct expressions * like `Foo { bar = baz }`. @@ -790,149 +751,1114 @@ private Type inferPathExprType(PathExpr pe, TypePath path) { ) } -/** Gets the explicit type qualifier of the call `ce`, if any. */ -private Type getTypeQualifier(CallExpr ce, TypePath path) { - exists(PathExpr pe, TypeMention tm | - pe = ce.getFunction() and - tm = pe.getPath().getQualifier() and - result = tm.resolveTypeAt(path) - ) +private newtype TFunctionPosition = + TArgumentFunctionPosition(ArgumentPosition pos) or + TReturnFunctionPosition() + +/** A position inside a function. Either `self`, `return`, or a parameter index. */ +class FunctionPosition extends TFunctionPosition { + predicate isSelf() { this.asArgumentPosition().isSelf() } + + int asPositional() { result = this.asArgumentPosition().asPosition() } + + predicate isPositional() { exists(this.asPositional()) } + + ArgumentPosition asArgumentPosition() { this = TArgumentFunctionPosition(result) } + + predicate isReturn() { this = TReturnFunctionPosition() } + + /** Gets the corresponding position when `f` is invoked via a function call. */ + bindingset[f] + FunctionPosition getFunctionCallAdjusted(Function f) { + this.isReturn() and + result = this + or + if f.getParamList().hasSelfParam() + then + this.isSelf() and result.asPositional() = 0 + or + result.asPositional() = this.asPositional() + 1 + else result = this + } + + string toString() { + result = this.asArgumentPosition().toString() + or + this.isReturn() and + result = "(return)" + } } /** - * A matching configuration for resolving types of call expressions - * like `foo::bar(baz)` and `foo.bar(baz)`. + * Provides logic for identifying functions that are overloaded based on their + * argument types. While Rust strictly speaking does not allow for overloading, + * it is still possible for a trait to have multiple implementations that differ + * only in the types of non-`self` arguments. */ -private module CallExprBaseMatchingInput implements MatchingInputSig { - private predicate paramPos(ParamList pl, Param p, int pos) { p = pl.getParam(pos) } +private module FunctionOverloading { + pragma[nomagic] + private Type resolveNonTypeParameterTypeAt(TypeMention tm, TypePath path) { + result = tm.resolveTypeAt(path) and + not result instanceof TypeParameter + } - private newtype TDeclarationPosition = - TArgumentDeclarationPosition(ArgumentPosition pos) or - TReturnDeclarationPosition() + bindingset[t1, t2] + private predicate typeMentionEqual(TypeMention t1, TypeMention t2) { + forex(TypePath path, Type type | resolveNonTypeParameterTypeAt(t1, path) = type | + resolveNonTypeParameterTypeAt(t2, path) = type + ) + } - class DeclarationPosition extends TDeclarationPosition { - predicate isSelf() { this.asArgumentPosition().isSelf() } + pragma[nomagic] + private predicate implSiblingCandidate( + Impl impl, TraitItemNode trait, Type rootType, TypeMention selfTy + ) { + trait = impl.(ImplItemNode).resolveTraitTy() and + // If `impl` has an expansion from a macro attribute, then it's been + // superseded by the output of the expansion (and usually the expansion + // contains the same `impl` block so considering both would give spurious + // siblings). + not exists(impl.getAttributeMacroExpansion()) and + selfTy = impl.getSelfTy() and + rootType = selfTy.resolveType() + } - int asPosition() { result = this.asArgumentPosition().asPosition() } + /** + * Holds if `impl1` and `impl2` are a sibling implementations of `trait`. We + * consider implementations to be siblings if they implement the same trait for + * the same type. In that case `Self` is the same type in both implementations, + * and method calls to the implementations cannot be resolved unambiguously + * based only on the receiver type. + */ + pragma[inline] + private predicate implSiblings(TraitItemNode trait, Impl impl1, Impl impl2) { + exists(Type rootType, TypeMention selfTy1, TypeMention selfTy2 | + impl1 != impl2 and + implSiblingCandidate(impl1, trait, rootType, selfTy1) and + implSiblingCandidate(impl2, trait, rootType, selfTy2) and + // In principle the second conjunct below should be superflous, but we still + // have ill-formed type mentions for types that we don't understand. For + // those checking both directions restricts further. Note also that we check + // syntactic equality, whereas equality up to renaming would be more + // correct. + typeMentionEqual(selfTy1, selfTy2) and + typeMentionEqual(selfTy2, selfTy1) + ) + } - ArgumentPosition asArgumentPosition() { this = TArgumentDeclarationPosition(result) } + /** + * Holds if `impl` is an implementation of `trait` and if another implementation + * exists for the same type. + */ + pragma[nomagic] + private predicate implHasSibling(Impl impl, Trait trait) { implSiblings(trait, impl, _) } - predicate isReturn() { this = TReturnDeclarationPosition() } + pragma[nomagic] + private predicate functionTypeAtPath(Function f, FunctionPosition pos, TypePath path, Type type) { + exists(TypeMention tm | type = tm.resolveTypeAt(path) | + pos.isSelf() and + tm = getSelfParamTypeMention(f.getParamList().getSelfParam()) + or + tm = f.getParam(pos.asPositional()).getTypeRepr() + or + pos.isReturn() and + tm = f.getRetType().getTypeRepr() + ) + } - string toString() { - result = this.asArgumentPosition().toString() + /** + * Holds if type parameter `tp` of `trait` occurs in the function with the name + * `functionName` at the `pos`th parameter at `path`. + * + * The special position `-1` refers to the return type of the function, which + * is sometimes needed to disambiguate associated function calls like + * `Default::default()` (in this case, `tp` is the special `Self` type parameter). + */ + bindingset[trait] + pragma[inline_late] + predicate traitTypeParameterOccurrence( + TraitItemNode trait, Function f, string functionName, FunctionPosition pos, TypePath path, + TypeParameter tp + ) { + f = trait.getAssocItem(functionName) and + functionTypeAtPath(f, pos, path, tp) and + tp = trait.(TraitTypeAbstraction).getATypeParameter() + } + + /** + * Holds if resolving the function `f` in `impl` with the name `functionName` + * requires inspecting the types of applied _arguments_ in order to determine + * whether it is the correct resolution. + */ + pragma[nomagic] + predicate functionResolutionDependsOnArgument( + ImplItemNode impl, string functionName, Function f, FunctionPosition pos, TypePath path, + Type type + ) { + /* + * As seen in the example below, when an implementation has a sibling for a + * trait we find occurrences of a type parameter of the trait in a function + * signature in the trait. We then find the type given in the implementation + * at the same position, which is a position that might disambiguate the + * function from its siblings. + * + * ```rust + * trait MyTrait { + * fn method(&self, value: Foo) -> Self; + * // ^^^^^^^^^^^^^ `pos` = 0 + * // ^ `path` = "T" + * } + * impl MyAdd for i64 { + * fn method(&self, value: Foo) -> Self { ... } + * // ^^^ `type` = i64 + * } + * ``` + * + * Note that we only check the root type symbol at the position. If the type + * at that position is a type constructor (for instance `Vec<..>`) then + * inspecting the entire type tree could be necessary to disambiguate the + * method. In that case we will still resolve several methods. + */ + + exists(TraitItemNode trait | + implHasSibling(impl, trait) and + traitTypeParameterOccurrence(trait, _, functionName, pos, path, _) and + functionTypeAtPath(f, pos, path, type) and + f = impl.getASuccessor(functionName) and + not pos.isReturn() + ) + } +} + +pragma[nomagic] +private TypeMention getSelfParamTypeMention(SelfParam self) { + result = self.(SelfParameterImplicitMention) + or + result = self.getTypeRepr() +} + +private Trait getATraitBound(Type t) { + result = t.(TypeParamTypeParameter).getTypeParam().(TypeParamItemNode).resolveABound() + or + result = t.(SelfTypeParameter).getTrait() + or + result = t.(ImplTraitType).getImplTraitTypeRepr().(ImplTraitTypeReprItemNode).resolveABound() + or + result = t.(DynTraitType).getTrait() +} + +private newtype TFunctionPositionType = + MkFunctionPositionType(Function f, FunctionPosition pos, ImplOrTraitItemNode i) { + f = i.getAnAssocItem() and + ( + f.getParamList().hasSelfParam() and + pos.asArgumentPosition().isSelf() or - this.isReturn() and - result = "(return)" - } + exists(f.getParam(pos.asPositional())) + or + f.getRetType().hasTypeRepr() and + pos.isReturn() + ) + } or + MkInherigedFunctionPositionType( + Function f, FunctionPosition pos, ImplOrTraitItemNode parent, ImplOrTraitItemNode i + ) { + exists(FunctionPositionType inherited | + inherited.appliesTo(f, pos, parent) and + f = i.getASuccessor(_) + | + parent = i.(ImplItemNode).resolveTraitTy() + or + parent = i.(TraitItemNode).resolveABound() + ) } - abstract class Declaration extends AstNode { - abstract TypeParameter getTypeParameter(TypeParameterPosition ppos); +/** + * The type of a function, at a given position, at a trait or `impl` block where + * the corresponding function is available. + * + * Example: + * + * ```rust + * trait T1 { + * fn m1(self); // self1 + * + * fn m2(self) { m1(self); } // self2 + * } + * + * trait T2 : T1 { + * fn m3(self); // self3 + * } + * + * impl T2 for X { + * fn m1(self) { ... } // self4 + * + * fn m3(self) { ... } // self5 + * } + * ``` + * + * param | `impl` or trait | type + * ------- | --------------- | -- + * `self1` | `trait T1` | `T1` + * `self1` | `trait T2` | `T2` + * `self2` | `trait T1` | `T1` + * `self2` | `trait T2` | `T2` + * `self2` | `impl T2 for X` | `X` + * `self3` | `trait T2` | `T2` + * `self4` | `impl T2 for X` | `X` + * `self5` | `impl T2 for X` | `X` + */ +private class FunctionPositionType extends TFunctionPositionType { + private predicate asFunctionPositionType(Function f, FunctionPosition pos, ImplOrTraitItemNode i) { + this = MkFunctionPositionType(f, pos, i) + } - pragma[nomagic] - abstract Type getParameterType(DeclarationPosition dpos, TypePath path); + private predicate asInheritedFunctionPositionType( + Function f, FunctionPosition pos, ImplOrTraitItemNode parent, ImplOrTraitItemNode i + ) { + this = MkInherigedFunctionPositionType(f, pos, parent, i) + } - abstract Type getReturnType(TypePath path); + predicate appliesTo(Function f, FunctionPosition pos, ImplOrTraitItemNode i) { + this.asFunctionPositionType(f, pos, i) + or + this.asInheritedFunctionPositionType(f, pos, _, i) + } - Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - result = this.getParameterType(dpos, path) + private Type getTypeAt0(TypePath path) { + exists(Function f, FunctionPosition pos | this.asFunctionPositionType(f, pos, _) | + pos.asArgumentPosition().isSelf() and + result = getSelfParamTypeMention(f.getParamList().getSelfParam()).resolveTypeAt(path) or - dpos.isReturn() and - result = this.getReturnType(path) - } + result = f.getParam(pos.asPositional()).getTypeRepr().(TypeMention).resolveTypeAt(path) + or + pos.isReturn() and + result = f.getRetType().getTypeRepr().(TypeMention).resolveTypeAt(path) + ) + or + exists( + Function f, FunctionPosition pos, FunctionPositionType parentType, ImplOrTraitItemNode parent, + ImplOrTraitItemNode i + | + this.asInheritedFunctionPositionType(f, pos, parent, i) and + parentType.appliesTo(f, pos, parent) + | + result = parentType.getTypeAt0(path) and + not result instanceof TSelfTypeParameter + or + exists(TypePath prefix, TypePath suffix | + parentType.getTypeAt0(prefix) = TSelfTypeParameter(_) and + result = resolveImplOrTraitType(i, suffix) and + path = prefix.append(suffix) + ) + ) } - abstract additional class TupleDeclaration extends Declaration { - override Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - result = super.getDeclaredType(dpos, path) + Type getTypeAt(TypePath path) { + // For methods belonging to a `trait`, we use the type of the trait itself + // instead of the implicit `Self` type parameter, as otherwise any type will + // match. + // + // Calls will use `getATraitBound` to map receiver types to the relevant + // traits when matching. + exists(Type t | t = this.getTypeAt0(path) | + not t instanceof SelfTypeParameter and + result = t or - dpos.isSelf() and - result = this.getReturnType(path) - } + result = TTrait(t.(SelfTypeParameter).getTrait()) + ) } - private class TupleStructDecl extends TupleDeclaration, Struct { - TupleStructDecl() { this.isTuple() } + private AstNode getReportingNode() { + exists(Function f, FunctionPosition pos | this.appliesTo(f, pos, _) | + pos.isSelf() and + result = f.getParamList().getSelfParam() + or + result = f.getParam(pos.asPositional()) + or + pos.isReturn() and + result = f.getRetType() + ) + } - override TypeParameter getTypeParameter(TypeParameterPosition ppos) { - typeParamMatchPosition(this.getGenericParamList().getATypeParam(), result, ppos) - } + string toString() { result = this.getReportingNode().toString() } - override Type getParameterType(DeclarationPosition dpos, TypePath path) { - exists(int pos | - result = this.getTupleField(pos).getTypeRepr().(TypeMention).resolveTypeAt(path) and - pos = dpos.asPosition() - ) + Location getLocation() { result = this.getReportingNode().getLocation() } +} + +bindingset[item, name] +pragma[inline_late] +private Function getMethodSuccessor(ItemNode item, string name, int arity) { + result = item.getASuccessor(name) and + arity = result.getParamList().getNumberOfParams() +} + +/** Provides logic for resolving method calls. */ +private module MethodCallResolution { + /** + * Holds if a method for `type` with the name `name` and the arity `arity` + * exists in `i`. + */ + pragma[nomagic] + predicate methodCandidate( + Type type, string name, int arity, ImplOrTraitItemNode i, FunctionPositionType self + ) { + exists(Function f, FunctionPosition pos | + f = i.getASuccessor(name) and + arity = f.getParamList().getNumberOfParams() and + type = self.getTypeAt(TypePath::nil()) and + self.appliesTo(f, pos, i) and + pos.isSelf() and + not i.(ImplItemNode).isBlanket() + ) + } + + /** + * A method call. + * + * This is either an actual method call, `x.m()`, or an index expression, `x[i]` + * (which is [syntactic sugar][1] for `*x.index(i)`). + * + * When resolving a method call, a list of [candidate receiver types][2] is constructed + * + * > by repeatedly dereferencing the receiver expression's type, adding each type + * > encountered to the list, then finally attempting an unsized coercion at the end, + * > and adding the result type if that is successful. + * > + * > Then, for each candidate `T`, add `&T` and `&mut T` to the list immediately after `T`. + * + * We do not currently model unsized coercions, and we do not yet model the `Deref` trait, + * instead we limit dereferencing to standard dereferencing and the fact that `String` + * dereferences to `str` . + * + * [1]: https://doc.rust-lang.org/std/ops/trait.Index.html + * [2]: https://doc.rust-lang.org/reference/expressions/method-call-expr.html#r-expr.method.candidate-receivers + */ + abstract class MethodCall extends Expr { + abstract predicate isMethodCall(string name, int arity); + + abstract Expr getArgument(ArgumentPosition pos); + + private Type getReceiverTypeAt(TypePath path) { + result = inferType(this.getArgument(any(ArgumentPosition pos | pos.isSelf())), path) } - override Type getReturnType(TypePath path) { - result = TStruct(this) and - path.isEmpty() + /** + * Same as `getACandidateReceiverTypeAt`, but without borrows. + */ + pragma[nomagic] + private Type getACandidateReceiverTypeAtNoBorrow(TypePath path, string derefChain) { + result = this.getReceiverTypeAt(path) and + derefChain = "" or - result = TTypeParamTypeParameter(this.getGenericParamList().getATypeParam()) and - path = TypePath::singleton(result) + exists(TypePath path0, Type t0, string derefChain0 | + t0 = this.getACandidateReceiverTypeAtNoMatch(path0, derefChain0) + | + path0.isCons(TRefTypeParameter(), path) and + result = t0 and + derefChain = derefChain0 + ".ref" + or + path0.isEmpty() and + path = path0 and + t0.(StructType).asItemNode() instanceof StringStruct and + result.(StructType).asItemNode() instanceof Builtins::Str and + derefChain = derefChain0 + ".str" + ) } - } - private class TupleVariantDecl extends TupleDeclaration, Variant { - TupleVariantDecl() { this.isTuple() } + pragma[nomagic] + private predicate isMethodCall0(Type rootType, string name, int arity, string derefChainBorrow) { + rootType = this.getACandidateReceiverTypeAt(TypePath::nil(), derefChainBorrow) and + this.isMethodCall(name, arity) + } - override TypeParameter getTypeParameter(TypeParameterPosition ppos) { - typeParamMatchPosition(this.getEnum().getGenericParamList().getATypeParam(), result, ppos) + pragma[nomagic] + private Type getACandidateReceiverTypeAtNoBorrowNoMatch(TypePath path, string derefChain) { + result = this.getACandidateReceiverTypeAtNoBorrow(path, derefChain) and + exists(Type rootType, string name, int arity, string derefChainBorrow | + derefChainBorrow = derefChain + ";" and + not derefChain.matches("%.ref") and // no need to try a borrow if the last thing we did was a deref + this.isMethodCall0(rootType, name, arity, derefChainBorrow) + | + forall(Impl impl, FunctionPositionType self | + methodCandidate(rootType, name, arity, impl, self) + | + IsInstantiationOf::isNotInstantiationOfStrict(MkMethodCallCand(this, + derefChainBorrow), impl, self) + ) + ) } - override Type getParameterType(DeclarationPosition dpos, TypePath path) { - exists(int pos | - result = this.getTupleField(pos).getTypeRepr().(TypeMention).resolveTypeAt(path) and - pos = dpos.asPosition() + pragma[nomagic] + private Type getACandidateReceiverTypeAtNoMatch(TypePath path, string derefChain) { + result = this.getACandidateReceiverTypeAtNoBorrowNoMatch(path, derefChain) and + exists(Type rootType, string name, int arity, string derefChainBorrow | + derefChainBorrow = derefChain + ";borrow" and + this.isMethodCall0(rootType, name, arity, derefChainBorrow) + | + forall(Impl impl, FunctionPositionType self | + methodCandidate(rootType, name, arity, impl, self) + | + IsInstantiationOf::isNotInstantiationOfStrict(MkMethodCallCand(this, + derefChainBorrow), impl, self) + ) ) } - override Type getReturnType(TypePath path) { - exists(Enum enum | enum = this.getEnum() | - result = TEnum(enum) and - path.isEmpty() + /** + * Gets a [candidate receiver type][1] of this method call at `path`. + * + * The type is obtained by repeatedly dereferencing the receiver expression's type, + * as long as the method cannot be resolved in an earlier candidate type, and possibly + * applying a borrow at the end. + * + * The string `derefChainBorrow` encodes the above, separated by a semi-colon. + * + * [1]: https://doc.rust-lang.org/reference/expressions/method-call-expr.html#r-expr.method.candidate-receivers + */ + pragma[nomagic] + Type getACandidateReceiverTypeAt(TypePath path, string derefChainBorrow) { + exists(string derefChain | + result = this.getACandidateReceiverTypeAtNoBorrow(path, derefChain) and + derefChainBorrow = derefChain + ";" or - result = TTypeParamTypeParameter(enum.getGenericParamList().getATypeParam()) and - path = TypePath::singleton(result) + exists(TypePath path0, Type t0 | + t0 = this.getACandidateReceiverTypeAtNoBorrowNoMatch(path0, derefChain) and + derefChainBorrow = derefChain + ";borrow" + | + path.isEmpty() and + result = TRefType() + or + path = TypePath::cons(TRefTypeParameter(), path0) and + result = t0 + ) ) } + + /** + * Gets a method that this call resolves to after having applied a sequence of + * dereferences and possibly a borrow on the receiver type, encoded in the string + * `derefChainBorrow`. + */ + pragma[nomagic] + Function resolveCallTarget(string derefChainBorrow) { + result = MkMethodCallCand(this, derefChainBorrow).(MethodCallCand).resolveCallTarget() + } + + predicate receiverHasImplicitDeref(AstNode receiver) { + exists(this.resolveCallTarget(".ref;")) and + receiver = this.getArgument(CallImpl::TSelfArgumentPosition()) + } + + predicate receiverHasImplicitBorrow(AstNode receiver) { + exists(this.resolveCallTarget(";borrow")) and + receiver = this.getArgument(CallImpl::TSelfArgumentPosition()) + } } - additional class FunctionDecl extends Declaration, Function { - override TypeParameter getTypeParameter(TypeParameterPosition ppos) { - typeParamMatchPosition(this.getGenericParamList().getATypeParam(), result, ppos) + private class MethodCallMethodCallExpr extends MethodCall, MethodCallExpr { + pragma[nomagic] + override predicate isMethodCall(string name, int arity) { + name = this.getIdentifier().getText() and + arity = this.getArgList().getNumberOfArgs() + } + + override Expr getArgument(ArgumentPosition pos) { + pos.isSelf() and + result = this.getReceiver() or - exists(ImplOrTraitItemNode i | this = i.getAnAssocItem() | - typeParamMatchPosition(i.getTypeParam(_), result, ppos) - or - ppos.isImplicit() and result = TSelfTypeParameter(i) + result = this.getArgList().getArg(pos.asPosition()) + } + } + + private class MethodCallIndexExpr extends MethodCall, IndexExpr { + pragma[nomagic] + override predicate isMethodCall(string name, int arity) { + name = "index" and + arity = 1 + } + + override Expr getArgument(ArgumentPosition pos) { + pos.isSelf() and + result = this.getBase() + or + pos.asPosition() = 0 and + result = this.getIndex() + } + } + + private newtype TMethodCallCand = + MkMethodCallCand(MethodCall mc, string derefChainBorrow) { + exists(mc.getACandidateReceiverTypeAt(_, derefChainBorrow)) + } + + /** A method call tagged with a candidate receiver type. */ + private class MethodCallCand extends MkMethodCallCand { + MethodCall mc; + string derefChainBorrow; + + MethodCallCand() { this = MkMethodCallCand(mc, derefChainBorrow) } + + MethodCall getMethodCall() { result = mc } + + Type getTypeAt(TypePath path) { + exists(Type t | t = mc.getACandidateReceiverTypeAt(path, derefChainBorrow) | + not exists(getATraitBound(t)) and + result = t or - ppos.isImplicit() and - result.(AssociatedTypeTypeParameter).getTrait() = i + result = TTrait(getATraitBound(t)) ) - or - ppos.isImplicit() and - this = result.(ImplTraitTypeTypeParameter).getFunction() } - override Type getParameterType(DeclarationPosition dpos, TypePath path) { + pragma[nomagic] + predicate isMethodCall(Type rootType, string name, int arity) { + rootType = this.getTypeAt(TypePath::nil()) and + mc.isMethodCall(name, arity) + } + + /** + * Holds if this method call has no inherent target, i.e., it does not + * resolve to a method in an `impl` block for the type of the receiver. + */ + pragma[nomagic] + private predicate hasNoInherentTarget() { + exists(Type rootType, string name, int arity | + this.isMethodCall(rootType, name, arity) and + forall(Impl impl | + methodCandidate(rootType, name, arity, impl, _) and + not impl.hasTrait() + | + IsInstantiationOf::isNotInstantiationOf(this, + impl, _) + ) + ) + } + + pragma[nomagic] + private Function resolveCallTargetCand(ImplOrTraitItemNode i, string name) { + IsInstantiationOf::isInstantiationOf(this, + i, _) and + mc.isMethodCall(name, _) and + result = getMethodSuccessor(i, name, _) and + if i.(Impl).hasTrait() + then + // inherent methods take precedence over trait methods, so only allow + // trait methods when there are no matching inherent methods + this.hasNoInherentTarget() + else any() + } + + /** Gets a method that matches this method call. */ + pragma[nomagic] + Function resolveCallTarget() { + exists(ImplOrTraitItemNode i, string name | result = this.resolveCallTargetCand(i, name) | + not FunctionOverloading::functionResolutionDependsOnArgument(i, name, _, + any(FunctionPosition pos | pos.isPositional()), _, _) + or + exists(FunctionPosition pos, TypePath path, Type type | + FunctionOverloading::functionResolutionDependsOnArgument(i, name, result, pos, + pragma[only_bind_into](path), type) and + pos.isPositional() and + inferType(mc.getArgument(pos.asArgumentPosition()), pragma[only_bind_into](path)) = type + ) + ) + } + + string toString() { result = mc.toString() + " [" + derefChainBorrow + "]" } + + Location getLocation() { result = mc.getLocation() } + } + + private module MethodCallIsInstantiationOfInput implements + IsInstantiationOfInputSig + { + pragma[nomagic] + private predicate methodCallCandidate( + MethodCallCand mc, ImplOrTraitItemNode i, FunctionPositionType constraint + ) { + exists(Type rootType, string name, int arity | + mc.isMethodCall(rootType, name, arity) and + methodCandidate(rootType, name, arity, i, constraint) + ) + } + + private predicate relevantTraitVisible(Element mc, Trait trait) { + trait = + any(ImplItemNode impl | methodCallCandidate(MkMethodCallCand(mc, _), impl, _)) + .resolveTraitTy() + } + + pragma[nomagic] + predicate potentialInstantiationOf( + MethodCallCand mc, TypeAbstraction abs, FunctionPositionType constraint + ) { + methodCallCandidate(mc, abs, constraint) and + ( + not exists(abs.(ImplItemNode).resolveTraitTy()) + or + // If the `impl` block implements a trait, that trait must be visible in + // order for the `impl` to be valid. + exists(Trait trait | pragma[only_bind_into](trait) = abs.(ImplItemNode).resolveTraitTy() | + TraitIsVisible::traitIsVisible(mc.getMethodCall(), + pragma[only_bind_into](trait)) + or + mc.getMethodCall() instanceof IndexExpr and + trait instanceof IndexTrait + ) + ) + } + + predicate relevantTypeMention(FunctionPositionType constraint) { + methodCandidate(_, _, _, _, constraint) + } + } +} + +/** + * A matching configuration for resolving types of method call expressions + * like `foo.bar(baz)`. + */ +private module MethodCallMatchingInput implements MatchingWithStateInputSig { + class DeclarationPosition = FunctionPosition; + + final class Declaration extends Function { + TypeParameter getTypeParameter(TypeParameterPosition ppos) { + typeParamMatchPosition(this.getGenericParamList().getATypeParam(), result, ppos) + or + exists(ImplOrTraitItemNode i | this = i.getAnAssocItem() | + typeParamMatchPosition(i.getTypeParam(_), result, ppos) + or + ppos.isImplicit() and result = TSelfTypeParameter(i) + or + ppos.isImplicit() and + result.(AssociatedTypeTypeParameter).getTrait() = i + ) + or + ppos.isImplicit() and + this = result.(ImplTraitTypeTypeParameter).getFunction() + } + + pragma[nomagic] + Type getParameterType(DeclarationPosition dpos, TypePath path) { exists(Param p, int i | - paramPos(this.getParamList(), p, i) and - i = dpos.asPosition() and + p = this.getParam(i) and + i = dpos.asPositional() and result = p.getTypeRepr().(TypeMention).resolveTypeAt(path) ) or + dpos.isSelf() and exists(SelfParam self | self = pragma[only_bind_into](this.getParamList().getSelfParam()) and - dpos.isSelf() + result = getSelfParamTypeMention(self).resolveTypeAt(path) + ) + } + + private Type resolveRetType(TypePath path) { + result = this.getRetType().getTypeRepr().(TypeMention).resolveTypeAt(path) + } + + pragma[nomagic] + Type getReturnType(TypePath path) { + if this.isAsync() + then + path.isEmpty() and + result = getFutureTraitType() + or + exists(TypePath suffix | + result = this.resolveRetType(suffix) and + path = TypePath::cons(getFutureOutputTypeParameter(), suffix) + ) + else result = this.resolveRetType(path) + } + + Type getDeclaredType(DeclarationPosition dpos, TypePath path) { + result = this.getParameterType(dpos, path) + or + dpos.isReturn() and + result = this.getReturnType(path) + } + } + + class AccessPosition = DeclarationPosition; + + class State = string; + + final private class MethodCallFinal = MethodCallResolution::MethodCall; + + class Access extends MethodCallFinal { + pragma[nomagic] + Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + exists(TypeMention arg | + result = arg.resolveTypeAt(path) and + arg = + this.(MethodCallExpr).getGenericArgList().getTypeArg(apos.asMethodTypeArgumentPosition()) + ) + } + + AstNode getNodeAt(AccessPosition apos) { + result = this.getArgument(apos.asArgumentPosition()) + or + result = this and apos.isReturn() + } + + pragma[nomagic] + private Type getInferredSelfType(State state, TypePath path) { + result = this.getACandidateReceiverTypeAt(path, state) + } + + pragma[nomagic] + Type getInferredNonSelfType(AccessPosition apos, TypePath path) { + if + // index expression `x[i]` desugars to `*x.index(i)`, so we must account for + // the implicit deref + apos.isReturn() and + this instanceof IndexExpr + then + path.isEmpty() and + result = TRefType() + or + exists(TypePath suffix | + result = inferType(this.getNodeAt(apos), suffix) and + path = TypePath::cons(TRefTypeParameter(), suffix) + ) + else ( + not apos.asArgumentPosition().isSelf() and + result = inferType(this.getNodeAt(apos), path) + ) + } + + bindingset[state] + Type getInferredType(State state, AccessPosition apos, TypePath path) { + apos.asArgumentPosition().isSelf() and + result = this.getInferredSelfType(state, path) + or + result = this.getInferredNonSelfType(apos, path) + } + + Declaration getTarget(State state) { + result = this.resolveCallTarget(state) // mutual recursion; resolving method calls requires resolving types and vice versa + } + } + + predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { + apos = dpos + } +} + +private module MethodCallMatching = MatchingWithState; + +pragma[nomagic] +private Type inferMethodCallExprType0( + MethodCallMatchingInput::Access a, MethodCallMatchingInput::AccessPosition apos, AstNode n, + string state, TypePath path +) { + exists(TypePath path0 | + n = a.getNodeAt(apos) and + result = MethodCallMatching::inferAccessType(a, state, apos, path0) + | + if + // index expression `x[i]` desugars to `*x.index(i)`, so we must account for + // the implicit deref + apos.isReturn() and + a instanceof IndexExpr + then path0.isCons(TRefTypeParameter(), path) + else path = path0 + ) +} + +/** + * Gets the type of `n` at `path`, where `n` is either a method call or an + * argument/receiver of a method call. + */ +pragma[nomagic] +private Type inferMethodCallExprType(AstNode n, TypePath path) { + exists( + MethodCallMatchingInput::Access a, MethodCallMatchingInput::AccessPosition apos, string state, + TypePath path0 + | + result = inferMethodCallExprType0(a, apos, n, state, path0) + | + ( + not apos.asArgumentPosition().isSelf() + or + state = ";" + ) and + path = path0 + or + // adjust for implicit deref + apos.asArgumentPosition().isSelf() and + state = ".ref;" and + path = TypePath::cons(TRefTypeParameter(), path0) + or + // adjust for implicit borrow + apos.asArgumentPosition().isSelf() and + state = ";borrow" and + path0.isCons(TRefTypeParameter(), path) + ) +} + +/** Provides logic for resolving function calls. */ +private module FunctionCallResolution { + private import FunctionOverloading + + /** A function call, `f(x)`. */ + final class FunctionCall extends CallExpr { + // FunctionCall() { this = Debug::getRelevantLocatable() } + private ItemNode getResolvedFunction() { result = CallExprImpl::getResolvedFunction(this) } + + /** + * Holds if the target of this call is ambigous, and type information is required + * to disambiguate. + */ + predicate isAmbigous() { + this.(Call).hasTrait() + or + functionResolutionDependsOnArgument(_, _, this.getResolvedFunction(), _, _, _) + } + + pragma[nomagic] + Function getAnAmbigousCandidate0(ImplItemNode impl, FunctionPosition pos, Function resolved) { + resolved = this.getResolvedFunction() and + ( + exists(TraitItemNode trait | + trait = this.(Call).getTrait() and + (result = resolved or result.implements(resolved)) and + result = impl.getASuccessor(_) + | + functionResolutionDependsOnArgument(impl, _, result, pos, _, _) + or + exists(TypeParameter tp | traitTypeParameterOccurrence(trait, resolved, _, pos, _, tp) | + not pos.isReturn() + or + // We only check that the context of the call provides relevant type information + // when no argument can + not traitTypeParameterOccurrence(trait, resolved, _, + any(FunctionPosition pos0 | not pos0.isReturn()), _, _) + ) + ) + or + result = resolved and + functionResolutionDependsOnArgument(impl, _, result, pos, _, _) + ) + } + + /** + * Gets a target candidate of this ambigous call, which belongs to `impl`. + * + * In order for the candidate to be a match, the argument type at `pos` must be + * checked against the type of the function at the same position. + * + * `resolved` is the corresponding function resolved through path resolution. + */ + pragma[nomagic] + Function getAnAmbigousCandidate(ImplItemNode impl, FunctionPosition pos, Function resolved) { + exists(FunctionPosition pos0 | + result = this.getAnAmbigousCandidate0(impl, pos0, resolved) and + pos = pos0.getFunctionCallAdjusted(result) + ) + } + + /** + * Same as `getAnAmbigousCandidate`, ranks the positions to be checked. + */ + private Function getAnAmbigousCandidateRanked( + ImplItemNode impl, FunctionPosition pos, Function f, int rnk + ) { + pos = + rank[rnk + 1](FunctionPosition pos0, int i1, int i2 | + result = this.getAnAmbigousCandidate(impl, pos0, f) and + ( + i1 = 0 and i2 = pos0.asPositional() + or + pos0.isReturn() and i1 = 1 and i2 = 0 + ) + | + pos0 order by i1, i2 + ) + } + + pragma[nomagic] + private Function resolveAmbigousFunctionCallTargetFromIndex(int index) { + exists(Impl impl, FunctionPosition pos, Function resolved | + IsInstantiationOf::isInstantiationOf(MkAmbigousFunctionCall(this, + resolved, pos), impl, _) and + result = this.getAnAmbigousCandidateRanked(impl, pos, resolved, index) | - result = inferAnnotatedType(self, path) // `self` parameter with type annotation + index = 0 or - result = inferImplicitSelfType(self, path) // `self` parameter without type annotation + result = this.resolveAmbigousFunctionCallTargetFromIndex(index - 1) ) + } + + /** + * Gets the target of `call`, where resolution relies on type inference. + */ + pragma[nomagic] + private Function resolveAmbigousFunctionCallTarget() { + result = + this.resolveAmbigousFunctionCallTargetFromIndex(max(int index | + result = this.getAnAmbigousCandidateRanked(_, _, _, index) + )) + } + + /** + * Gets the target of this call, where resolution does not rely on type inference. + */ + pragma[nomagic] + private ItemNode resolveUnambigousFunctionCallTarget() { + result = this.getResolvedFunction() and + not this.isAmbigous() + } + + // inline to reduce non-linear recursion + pragma[inline] + ItemNode resolveCallTarget() { + result = this.resolveUnambigousFunctionCallTarget() + or + result = this.resolveAmbigousFunctionCallTarget() + } + } + + private newtype TAmbigousFunctionCall = + MkAmbigousFunctionCall(FunctionCall call, Function resolved, FunctionPosition pos) { + exists(call.getAnAmbigousCandidate(_, pos, resolved)) + } + + private class AmbigousFunctionCall extends MkAmbigousFunctionCall { + FunctionCall call; + Function resolved; + FunctionPosition pos; + + AmbigousFunctionCall() { this = MkAmbigousFunctionCall(call, resolved, pos) } + + pragma[nomagic] + Type getTypeAt(TypePath path) { + result = inferType(call.(CallExpr).getArg(pos.asPositional()), path) or + pos.isReturn() and + result = inferType(call, path) + } + + string toString() { result = call.toString() + " (pos: " + pos + ")" } + + Location getLocation() { result = call.getLocation() } + } + + private module AmbigousFuncIsInstantiationOfInput implements + IsInstantiationOfInputSig + { + pragma[nomagic] + predicate potentialInstantiationOf( + AmbigousFunctionCall ce, TypeAbstraction impl, FunctionPositionType constraint + ) { + exists(FunctionCall call, FunctionPosition pos, Function resolved, Function cand | + ce = MkAmbigousFunctionCall(call, resolved, pos.getFunctionCallAdjusted(cand)) and + cand = call.getAnAmbigousCandidate0(impl, pos, resolved) and + constraint.appliesTo(cand, pos, impl) + ) + } + } +} + +/** + * A matching configuration for resolving types of function calls + * like `foo::bar(baz)`. + */ +private module FunctionCallMatchingInput implements MatchingInputSig { + class DeclarationPosition = FunctionPosition; + + abstract class Declaration extends AstNode { + abstract TypeParameter getTypeParameter(TypeParameterPosition ppos); + + pragma[nomagic] + abstract Type getParameterType(DeclarationPosition dpos, TypePath path); + + abstract Type getReturnType(TypePath path); + + Type getDeclaredType(DeclarationPosition dpos, TypePath path) { + result = this.getParameterType(dpos, path) + or + dpos.isReturn() and + result = this.getReturnType(path) + } + } + + abstract additional class TupleDeclaration extends Declaration { + override Type getDeclaredType(DeclarationPosition dpos, TypePath path) { + result = super.getDeclaredType(dpos, path) + or + dpos.isSelf() and + result = this.getReturnType(path) + } + } + + private class TupleStructDecl extends TupleDeclaration, Struct { + TupleStructDecl() { this.isTuple() } + + override TypeParameter getTypeParameter(TypeParameterPosition ppos) { + typeParamMatchPosition(this.getGenericParamList().getATypeParam(), result, ppos) + } + + override Type getParameterType(DeclarationPosition dpos, TypePath path) { + exists(int pos | + result = this.getTupleField(pos).getTypeRepr().(TypeMention).resolveTypeAt(path) and + pos = dpos.asPositional() + ) + } + + override Type getReturnType(TypePath path) { + result = TStruct(this) and + path.isEmpty() + or + result = TTypeParamTypeParameter(this.getGenericParamList().getATypeParam()) and + path = TypePath::singleton(result) + } + } + + private class TupleVariantDecl extends TupleDeclaration, Variant { + TupleVariantDecl() { this.isTuple() } + + override TypeParameter getTypeParameter(TypeParameterPosition ppos) { + typeParamMatchPosition(this.getEnum().getGenericParamList().getATypeParam(), result, ppos) + } + + override Type getParameterType(DeclarationPosition dpos, TypePath path) { + exists(int pos | + result = this.getTupleField(pos).getTypeRepr().(TypeMention).resolveTypeAt(path) and + pos = dpos.asPositional() + ) + } + + override Type getReturnType(TypePath path) { + exists(Enum enum | enum = this.getEnum() | + result = TEnum(enum) and + path.isEmpty() + or + result = TTypeParamTypeParameter(enum.getGenericParamList().getATypeParam()) and + path = TypePath::singleton(result) + ) + } + } + + additional class FunctionDecl extends Declaration, Function { + override TypeParameter getTypeParameter(TypeParameterPosition ppos) { + typeParamMatchPosition(this.getGenericParamList().getATypeParam(), result, ppos) + or + exists(ImplOrTraitItemNode i | this = i.getAnAssocItem() | + typeParamMatchPosition(i.getTypeParam(_), result, ppos) + or + ppos.isImplicit() and result = TSelfTypeParameter(i) + or + ppos.isImplicit() and + result.(AssociatedTypeTypeParameter).getTrait() = i + ) + or + ppos.isImplicit() and + this = result.(ImplTraitTypeTypeParameter).getFunction() + } + + override Type getParameterType(DeclarationPosition dpos, TypePath path) { + // todo: update // For associated functions, we may also need to match type arguments against // the `Self` type. For example, in // @@ -949,15 +1875,24 @@ private module CallExprBaseMatchingInput implements MatchingInputSig { // ``` // // we need to match `i32` against the type parameter `T` of the `impl` block. + dpos.isSelf() and exists(ImplOrTraitItemNode i | this = i.getAnAssocItem() and - dpos.isSelf() and - not this.getParamList().hasSelfParam() - | - result = TSelfTypeParameter(i) and - path.isEmpty() - or - result = resolveImplSelfType(i, path) + result = resolveImplOrTraitType(i, path) + ) + or + exists(Param p, int i | + p = this.getParam(i) and + result = p.getTypeRepr().(TypeMention).resolveTypeAt(path) and + if this.getParamList().hasSelfParam() + then dpos.asPositional() = i + 1 + else dpos.asPositional() = i + ) + or + dpos.asPositional() = 0 and + exists(SelfParam self | + self = pragma[only_bind_into](this.getParamList().getSelfParam()) and + result = getSelfParamTypeMention(self).resolveTypeAt(path) ) } @@ -979,29 +1914,9 @@ private module CallExprBaseMatchingInput implements MatchingInputSig { } } - private newtype TAccessPosition = - TArgumentAccessPosition(ArgumentPosition pos, Boolean borrowed, Boolean certain) or - TReturnAccessPosition() - - class AccessPosition extends TAccessPosition { - ArgumentPosition getArgumentPosition() { this = TArgumentAccessPosition(result, _, _) } - - predicate isBorrowed(boolean certain) { this = TArgumentAccessPosition(_, true, certain) } - - predicate isReturn() { this = TReturnAccessPosition() } - - string toString() { - exists(ArgumentPosition pos, boolean borrowed, boolean certain | - this = TArgumentAccessPosition(pos, borrowed, certain) and - result = pos + ":" + borrowed + ":" + certain - ) - or - this.isReturn() and - result = "(return)" - } - } + class AccessPosition = DeclarationPosition; - final class Access extends Call { + class Access extends FunctionCallResolution::FunctionCall { pragma[nomagic] Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { exists(TypeMention arg | result = arg.resolveTypeAt(path) | @@ -1010,161 +1925,256 @@ private module CallExprBaseMatchingInput implements MatchingInputSig { arg = p.getSegment().getGenericArgList().getTypeArg(pragma[only_bind_into](i)) and apos.asTypeParam() = resolvePath(p).getTypeParam(pragma[only_bind_into](i)) ) - or - arg = - this.(MethodCallExpr).getGenericArgList().getTypeArg(apos.asMethodTypeArgumentPosition()) ) } AstNode getNodeAt(AccessPosition apos) { - exists(ArgumentPosition pos, boolean borrowed, boolean certain | - apos = TArgumentAccessPosition(pos, borrowed, certain) and - result = this.getArgument(pos) - | - if this.implicitBorrowAt(pos, _) - then borrowed = true and this.implicitBorrowAt(pos, certain) - else ( - borrowed = false and certain = true - ) + exists(ArgumentPosition pos | + pos = apos.asArgumentPosition() and + result = this.getArg(pos.asPosition()) ) or result = this and apos.isReturn() } + pragma[nomagic] Type getInferredType(AccessPosition apos, TypePath path) { - result = inferType(this.getNodeAt(apos), path) - or // The `Self` type is supplied explicitly as a type qualifier, e.g. `Foo::::baz()` - apos = TArgumentAccessPosition(CallImpl::TSelfArgumentPosition(), false, false) and - result = getTypeQualifier(this, path) + apos.asArgumentPosition().isSelf() and + exists(PathExpr pe, TypeMention tm | + pe = this.getFunction() and + tm = pe.getPath().getQualifier() and + result = tm.resolveTypeAt(path) and + not resolvePath(tm) instanceof Trait + ) + or + result = inferType(this.getNodeAt(apos), path) } Declaration getTarget() { - result = resolveMethodCallTarget(this) // mutual recursion; resolving method calls requires resolving types and vice versa - or - result = resolveFunctionCallTarget(this) // potential mutual recursion; resolving some associated function calls requires resolving types + result = this.resolveCallTarget() // potential mutual recursion; resolving some associated function calls requires resolving types } } predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { - apos.getArgumentPosition() = dpos.asArgumentPosition() - or - apos.isReturn() and dpos.isReturn() + apos = dpos } +} - bindingset[apos, target, path, t] - pragma[inline_late] - predicate adjustAccessType( - AccessPosition apos, Declaration target, TypePath path, Type t, TypePath pathAdj, Type tAdj - ) { - apos.isBorrowed(true) and - pathAdj = TypePath::cons(TRefTypeParameter(), path) and - tAdj = t - or - apos.isBorrowed(false) and - exists(Type selfParamType | - selfParamType = - target - .getParameterType(TArgumentDeclarationPosition(apos.getArgumentPosition()), - TypePath::nil()) - | - if selfParamType = TRefType() +private module FunctionCallMatching = Matching; + +pragma[nomagic] +private Type inferCallExprType(AstNode n, TypePath path) { + exists(FunctionCallMatchingInput::Access a, FunctionCallMatchingInput::AccessPosition apos | + n = a.getNodeAt(apos) and + result = FunctionCallMatching::inferAccessType(a, apos, path) + ) +} + +/** Provides logic for resolving operations. */ +private module OperationResolution { + /** An operation, `x + y`. */ + final class Op extends Operation { + pragma[nomagic] + private Type getTypeAt0(TypePath path) { + if this.(Call).implicitBorrowAt(any(ArgumentPosition pos | pos.isSelf()), true) then - if t != TRefType() and path.isEmpty() - then - // adjust for implicit borrow - pathAdj.isEmpty() and - tAdj = TRefType() + result = TRefType() and + path.isEmpty() + or + exists(TypePath path0 | + result = inferType(this.getOperand(0), path0) and + path = TypePath::cons(TRefTypeParameter(), path0) + ) + else result = inferType(this.getOperand(0), path) + } + + pragma[nomagic] + Type getTypeAt(TypePath path) { + exists(Type t | t = this.getTypeAt0(path) | + not exists(getATraitBound(t)) and + result = t + or + result = TTrait(getATraitBound(t)) + ) + } + + pragma[nomagic] + predicate isOperation(Type rootType, string name, int arity) { + name = this.(Call).getMethodName() and + arity = this.(Call).getNumberOfArguments() and + rootType = this.getTypeAt(TypePath::nil()) + } + + pragma[nomagic] + private predicate hasImplCandidate(ImplOrTraitItemNode i) { + IsInstantiationOf::isInstantiationOf(this, + i, _) + } + + /** Gets a method from an `impl` block that matches the method call `mc`. */ + pragma[nomagic] + Function resolveCallTarget() { + exists(ImplOrTraitItemNode i, string name | + this.hasImplCandidate(i) and + name = this.(Call).getMethodName() and + result = getMethodSuccessor(i, name, _) + | + not FunctionOverloading::functionResolutionDependsOnArgument(i, name, _, + any(FunctionPosition pos | pos.isPositional()), _, _) + or + exists(FunctionPosition pos, TypePath path, Type type | + FunctionOverloading::functionResolutionDependsOnArgument(i, name, result, pos, + pragma[only_bind_into](path), type) and + inferType(this.getOperand(pos.asPositional() + 1), pragma[only_bind_into](path)) = type + ) + ) + } + } + + private module OperationIsInstantiationOfInput implements + IsInstantiationOfInputSig + { + /** + * Holds if a method for `type` for `trait` with the name `name` and the arity + * `arity` exists in `impl`. + */ + // pragma[nomagic] + pragma[inline] + private predicate methodCandidateTrait( + Type type, Trait trait, string name, int arity, ImplOrTraitItemNode i, + FunctionPositionType self + ) { + MethodCallResolution::methodCandidate(type, name, arity, i, self) and + ( + trait = i.(ImplItemNode).resolveTraitTy() + or + trait = i + ) + } + + pragma[nomagic] + predicate potentialInstantiationOf(Op op, TypeAbstraction abs, FunctionPositionType constraint) { + exists(Type rootType, string name, int arity | + op.isOperation(rootType, name, arity) and + methodCandidateTrait(rootType, op.(Call).getTrait(), name, arity, abs, constraint) + ) + } + + predicate relevantTypeMention(FunctionPositionType constraint) { + methodCandidateTrait(_, _, _, _, _, constraint) + } + } +} + +/** + * A matching configuration for resolving types of operations + * like `a + b`. + */ +private module OperationMatchingInput implements MatchingInputSig { + private import codeql.rust.elements.internal.OperationImpl as OperationImpl + + class DeclarationPosition = FunctionPosition; + + class Declaration extends MethodCallMatchingInput::Declaration { + pragma[nomagic] + private predicate borrowsAt(DeclarationPosition pos) { + // todo: cleanup + exists(TraitItemNode t, Function f, string path, string method | + ( + f = this or - // adjust for implicit borrow - pathAdj = TypePath::singleton(TRefTypeParameter()) and - tAdj = t - else - if path.isCons(TRefTypeParameter(), _) - then - pathAdj = path and - tAdj = t - else ( - // adjust for implicit borrow - not (t = TRefType() and path.isEmpty()) and - pathAdj = TypePath::cons(TRefTypeParameter(), path) and - tAdj = t - ) - else ( - // adjust for implicit deref - path.isCons(TRefTypeParameter(), pathAdj) and - tAdj = t + this.implements(f) + ) and + f = t.getAssocItem(method) and + path = t.getCanonicalPath(_) + | + exists(int borrows | OperationImpl::isOverloaded(_, _, path, method, borrows) | + pos.isSelf() and borrows >= 1 + or + pos.asPositional() = 0 and + borrows >= 2 + ) + ) + } + + pragma[nomagic] + private Type getParameterType(DeclarationPosition dpos, TypePath path) { + exists(TypePath path0 | + result = super.getParameterType(dpos, path0) and + if this.borrowsAt(dpos) then path0.isCons(TRefTypeParameter(), path) else path0 = path + ) + } + + pragma[nomagic] + private predicate derefsReturn() { + exists(Function f | + ( + f = this + or + this.implements(f) + ) and + ( + f = any(DerefTrait t).getDerefFunction() + or + f = any(IndexTrait t).getIndexFunction() + ) + ) + } + + pragma[nomagic] + private Type getReturnType(TypePath path) { + exists(TypePath path0 | + result = super.getReturnType(path0) and + if this.derefsReturn() then path0.isCons(TRefTypeParameter(), path) else path0 = path + ) + } + + Type getDeclaredType(DeclarationPosition dpos, TypePath path) { + result = this.getParameterType(dpos, path) + or + dpos.isReturn() and + result = this.getReturnType(path) + } + } + + class AccessPosition = MethodCallMatchingInput::AccessPosition; + + class Access extends OperationResolution::Op { + Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } + + AstNode getNodeAt(AccessPosition apos) { + exists(ArgumentPosition pos | pos = apos.asArgumentPosition() | + result = this.getOperand(0) and + pos.isSelf() or - not path.isCons(TRefTypeParameter(), _) and - not (t = TRefType() and path.isEmpty()) and - pathAdj = path and - tAdj = t + result = this.getOperand(pos.asPosition() + 1) ) - ) - or - not apos.isBorrowed(_) and - pathAdj = path and - tAdj = t + or + result = this and apos.isReturn() + } + + pragma[nomagic] + Type getInferredType(AccessPosition apos, TypePath path) { + result = inferType(this.getNodeAt(apos), path) + } + + Declaration getTarget() { + result = this.resolveCallTarget() // mutual recursion + } } + + predicate accessDeclarationPositionMatch = + MethodCallMatchingInput::accessDeclarationPositionMatch/2; } -private module CallExprBaseMatching = Matching; +private module OperationMatching = Matching; -/** - * Gets the type of `n` at `path`, where `n` is either a call or an - * argument/receiver of a call. - */ pragma[nomagic] -private Type inferCallExprBaseType(AstNode n, TypePath path) { - exists( - CallExprBaseMatchingInput::Access a, CallExprBaseMatchingInput::AccessPosition apos, - TypePath path0 - | +private Type inferOperationType(AstNode n, TypePath path) { + exists(OperationMatchingInput::Access a, OperationMatchingInput::AccessPosition apos | n = a.getNodeAt(apos) and - result = CallExprBaseMatching::inferAccessType(a, apos, path0) - | - if - apos.isBorrowed(true) - or - // The desugaring of the unary `*e` is `*Deref::deref(&e)` and the - // desugaring of `a[b]` is `*Index::index(&a, b)`. To handle the deref - // expression after the call we must strip a `&` from the type at the - // return position. - apos.isReturn() and - (a instanceof DerefExpr or a instanceof IndexExpr) - then path0.isCons(TRefTypeParameter(), path) - else - if apos.isBorrowed(false) - then - exists(Type argType | argType = inferType(n) | - if argType = TRefType() - then - path = path0 and - path0.isCons(TRefTypeParameter(), _) - or - // adjust for implicit deref - not path0.isCons(TRefTypeParameter(), _) and - not (path0.isEmpty() and result = TRefType()) and - path = TypePath::cons(TRefTypeParameter(), path0) - else ( - not ( - argType.(StructType).asItemNode() instanceof StringStruct and - result.(StructType).asItemNode() instanceof Builtins::Str - ) and - ( - not path0.isCons(TRefTypeParameter(), _) and - not (path0.isEmpty() and result = TRefType()) and - path = path0 - or - // adjust for implicit borrow - path0.isCons(TRefTypeParameter(), path) - ) - ) - ) - else ( - not apos.isBorrowed(_) and - path = path0 - ) + result = OperationMatching::inferAccessType(a, apos, path) ) } @@ -1541,6 +2551,7 @@ private Type inferIndexExprType(IndexExpr ie, TypePath path) { ) and result = inferType(ie.getBase(), exprPath) | + // todo: remove? exprPath.isCons(any(Vec v).getElementTypeParameter(), path) or exprPath.isCons(any(ArrayTypeParameter tp), path) @@ -1609,9 +2620,9 @@ private Type inferStructPatType(AstNode n, TypePath path) { * like `let Some(x) = ...`. */ private module TupleStructPatMatchingInput implements MatchingInputSig { - class DeclarationPosition = CallExprBaseMatchingInput::DeclarationPosition; + class DeclarationPosition = FunctionCallMatchingInput::DeclarationPosition; - class Declaration = CallExprBaseMatchingInput::TupleDeclaration; + class Declaration = FunctionCallMatchingInput::TupleDeclaration; class AccessPosition = DeclarationPosition; @@ -1619,7 +2630,7 @@ private module TupleStructPatMatchingInput implements MatchingInputSig { Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } AstNode getNodeAt(AccessPosition apos) { - result = this.getField(apos.asPosition()) + result = this.getField(apos.asPositional()) or result = this and apos.isSelf() @@ -1823,499 +2834,6 @@ private Type inferCastExprType(CastExpr ce, TypePath path) { result = ce.getTypeRepr().(TypeMention).resolveTypeAt(path) } -final class MethodCall extends Call { - MethodCall() { exists(this.getReceiver()) } - - private Type getReceiverTypeAt(TypePath path) { - result = inferType(super.getReceiver(), path) - or - result = getTypeQualifier(this, path) - } - - /** Gets the type of the receiver of the method call at `path`. */ - Type getTypeAt(TypePath path) { - if - this.receiverImplicitlyBorrowed() or - this.(CallImpl::CallExprMethodCall).hasExplicitSelfBorrow() - then - exists(TypePath path0, Type t0 | - t0 = this.getReceiverTypeAt(path0) and - ( - path0.isCons(TRefTypeParameter(), path) - or - ( - not path0.isCons(TRefTypeParameter(), _) and - not (path0.isEmpty() and result = TRefType()) - or - // Ideally we should find all methods on reference types, but as - // that currently causes a blowup we limit this to the `deref` - // method in order to make dereferencing work. - this.getMethodName() = "deref" - ) and - path = path0 - ) - | - result = t0 - or - // We do not yet model the `Deref` trait, so we hard-code the fact that - // `String` dereferences to `str` here. This allows us e.g. to resolve - // `x.parse::()` to the function `::parse` when `x` has - // type `String`. - // - // See also https://doc.rust-lang.org/reference/expressions/method-call-expr.html#r-expr.method.autoref-deref - path.isEmpty() and - t0.(StructType).asItemNode() instanceof StringStruct and - result.(StructType).asItemNode() instanceof Builtins::Str - ) - else result = this.getReceiverTypeAt(path) - } -} - -/** - * Holds if a method for `type` with the name `name` and the arity `arity` - * exists in `impl`. - */ -pragma[nomagic] -private predicate methodCandidate(Type type, string name, int arity, Impl impl) { - type = impl.getSelfTy().(TypeMention).resolveType() and - exists(Function f | - f = impl.(ImplItemNode).getASuccessor(name) and - f.getParamList().hasSelfParam() and - arity = f.getParamList().getNumberOfParams() - ) -} - -/** - * Holds if a method for `type` for `trait` with the name `name` and the arity - * `arity` exists in `impl`. - */ -pragma[nomagic] -private predicate methodCandidateTrait(Type type, Trait trait, string name, int arity, Impl impl) { - trait = impl.(ImplItemNode).resolveTraitTy() and - methodCandidate(type, name, arity, impl) -} - -pragma[nomagic] -private predicate isMethodCall(MethodCall mc, Type rootType, string name, int arity) { - rootType = mc.getTypeAt(TypePath::nil()) and - name = mc.getMethodName() and - arity = mc.getNumberOfArguments() -} - -private module IsInstantiationOfInput implements IsInstantiationOfInputSig { - /** Holds if `mc` specifies a trait and might target a method in `impl`. */ - pragma[nomagic] - private predicate methodCallTraitCandidate(MethodCall mc, Impl impl) { - exists(Type rootType, string name, int arity | - isMethodCall(mc, rootType, name, arity) and - methodCandidateTrait(rootType, mc.getTrait(), name, arity, impl) - ) - } - - /** Holds if `mc` does not specify a trait and might target a method in `impl`. */ - pragma[nomagic] - private predicate methodCallCandidate(MethodCall mc, Impl impl) { - exists(Type rootType, string name, int arity | - not exists(mc.getTrait()) and - isMethodCall(mc, rootType, name, arity) and - methodCandidate(rootType, name, arity, impl) - ) - } - - private predicate relevantTraitVisible(Element mc, Trait trait) { - trait = any(ImplItemNode impl | methodCallCandidate(mc, impl)).resolveTraitTy() - } - - bindingset[impl] - pragma[inline_late] - private TypeRepr getImplSelfTy(Impl impl) { result = impl.getSelfTy() } - - pragma[nomagic] - predicate potentialInstantiationOf(MethodCall mc, TypeAbstraction impl, TypeMention constraint) { - constraint = getImplSelfTy(impl) and - ( - methodCallTraitCandidate(mc, impl) - or - methodCallCandidate(mc, impl) and - ( - not exists(impl.(ImplItemNode).resolveTraitTy()) - or - // If the `impl` block implements a trait, that trait must be visible in - // order for the `impl` to be valid. - exists(Trait trait | - pragma[only_bind_into](trait) = impl.(ImplItemNode).resolveTraitTy() and - TraitIsVisible::traitIsVisible(mc, pragma[only_bind_into](trait)) - ) - ) - ) - } - - predicate relevantTypeMention(TypeMention constraint) { - exists(Impl impl | methodCandidate(_, _, _, impl) and constraint = impl.getSelfTy()) - } -} - -bindingset[item, name] -pragma[inline_late] -private Function getMethodSuccessor(ItemNode item, string name) { - result = item.getASuccessor(name) -} - -bindingset[tp, name] -pragma[inline_late] -private Function getTypeParameterMethod(TypeParameter tp, string name) { - result = getMethodSuccessor(tp.(TypeParamTypeParameter).getTypeParam(), name) - or - result = getMethodSuccessor(tp.(SelfTypeParameter).getTrait(), name) - or - result = getMethodSuccessor(tp.(ImplTraitTypeTypeParameter).getImplTraitTypeRepr(), name) -} - -pragma[nomagic] -private Type resolveNonTypeParameterTypeAt(TypeMention tm, TypePath path) { - result = tm.resolveTypeAt(path) and - not result instanceof TypeParameter -} - -bindingset[t1, t2] -private predicate typeMentionEqual(TypeMention t1, TypeMention t2) { - forex(TypePath path, Type type | resolveNonTypeParameterTypeAt(t1, path) = type | - resolveNonTypeParameterTypeAt(t2, path) = type - ) -} - -pragma[nomagic] -private predicate implSiblingCandidate( - Impl impl, TraitItemNode trait, Type rootType, TypeMention selfTy -) { - trait = impl.(ImplItemNode).resolveTraitTy() and - // If `impl` has an expansion from a macro attribute, then it's been - // superseded by the output of the expansion (and usually the expansion - // contains the same `impl` block so considering both would give spurious - // siblings). - not exists(impl.getAttributeMacroExpansion()) and - selfTy = impl.getSelfTy() and - rootType = selfTy.resolveType() -} - -/** - * Holds if `impl1` and `impl2` are a sibling implementations of `trait`. We - * consider implementations to be siblings if they implement the same trait for - * the same type. In that case `Self` is the same type in both implementations, - * and method calls to the implementations cannot be resolved unambiguously - * based only on the receiver type. - */ -pragma[inline] -private predicate implSiblings(TraitItemNode trait, Impl impl1, Impl impl2) { - exists(Type rootType, TypeMention selfTy1, TypeMention selfTy2 | - impl1 != impl2 and - implSiblingCandidate(impl1, trait, rootType, selfTy1) and - implSiblingCandidate(impl2, trait, rootType, selfTy2) and - // In principle the second conjunct below should be superflous, but we still - // have ill-formed type mentions for types that we don't understand. For - // those checking both directions restricts further. Note also that we check - // syntactic equality, whereas equality up to renaming would be more - // correct. - typeMentionEqual(selfTy1, selfTy2) and - typeMentionEqual(selfTy2, selfTy1) - ) -} - -/** - * Holds if `impl` is an implementation of `trait` and if another implementation - * exists for the same type. - */ -pragma[nomagic] -private predicate implHasSibling(Impl impl, Trait trait) { implSiblings(trait, impl, _) } - -pragma[nomagic] -private predicate functionTypeAtPath(Function f, int pos, TypePath path, Type type) { - exists(TypeMention tm | type = tm.resolveTypeAt(path) | - tm = f.getParam(pos).getTypeRepr() - or - pos = -1 and - tm = f.getRetType().getTypeRepr() - ) -} - -/** - * Holds if type parameter `tp` of `trait` occurs in the function with the name - * `functionName` at the `pos`th parameter at `path`. - * - * The special position `-1` refers to the return type of the function, which - * is sometimes needed to disambiguate associated function calls like - * `Default::default()` (in this case, `tp` is the special `Self` type parameter). - */ -bindingset[trait] -pragma[inline_late] -private predicate traitTypeParameterOccurrence( - TraitItemNode trait, Function f, string functionName, int pos, TypePath path, TypeParameter tp -) { - f = trait.getAssocItem(functionName) and - functionTypeAtPath(f, pos, path, tp) and - tp = trait.(TraitTypeAbstraction).getATypeParameter() -} - -/** - * Holds if resolving the function `f` in `impl` with the name `functionName` - * requires inspecting the types of applied _arguments_ in order to determine - * whether it is the correct resolution. - */ -pragma[nomagic] -private predicate functionResolutionDependsOnArgument( - ImplItemNode impl, string functionName, Function f, int pos, TypePath path, Type type -) { - /* - * As seen in the example below, when an implementation has a sibling for a - * trait we find occurrences of a type parameter of the trait in a function - * signature in the trait. We then find the type given in the implementation - * at the same position, which is a position that might disambiguate the - * function from its siblings. - * - * ```rust - * trait MyTrait { - * fn method(&self, value: Foo) -> Self; - * // ^^^^^^^^^^^^^ `pos` = 0 - * // ^ `path` = "T" - * } - * impl MyAdd for i64 { - * fn method(&self, value: Foo) -> Self { ... } - * // ^^^ `type` = i64 - * } - * ``` - * - * Note that we only check the root type symbol at the position. If the type - * at that position is a type constructor (for instance `Vec<..>`) then - * inspecting the entire type tree could be necessary to disambiguate the - * method. In that case we will still resolve several methods. - */ - - exists(TraitItemNode trait | - implHasSibling(impl, trait) and - traitTypeParameterOccurrence(trait, _, functionName, pos, path, _) and - functionTypeAtPath(f, pos, path, type) and - f = impl.getAssocItem(functionName) and - pos >= 0 - ) -} - -/** - * Holds if the method call `mc` has no inherent target, i.e., it does not - * resolve to a method in an `impl` block for the type of the receiver. - */ -pragma[nomagic] -private predicate methodCallHasNoInherentTarget(MethodCall mc) { - exists(Type rootType, string name, int arity | - isMethodCall(mc, rootType, name, arity) and - forall(Impl impl | - methodCandidate(rootType, name, arity, impl) and - not impl.hasTrait() - | - IsInstantiationOf::isNotInstantiationOf(mc, impl, _) - ) - ) -} - -pragma[nomagic] -private predicate methodCallHasImplCandidate(MethodCall mc, Impl impl) { - IsInstantiationOf::isInstantiationOf(mc, impl, _) and - if impl.hasTrait() and not exists(mc.getTrait()) - then - // inherent methods take precedence over trait methods, so only allow - // trait methods when there are no matching inherent methods - methodCallHasNoInherentTarget(mc) - else any() -} - -/** Gets a method from an `impl` block that matches the method call `mc`. */ -pragma[nomagic] -private Function getMethodFromImpl(MethodCall mc) { - exists(Impl impl, string name | - methodCallHasImplCandidate(mc, impl) and - name = mc.getMethodName() and - result = getMethodSuccessor(impl, name) - | - not functionResolutionDependsOnArgument(impl, name, _, _, _, _) - or - exists(int pos, TypePath path, Type type | - functionResolutionDependsOnArgument(impl, name, result, pos, pragma[only_bind_into](path), - type) and - inferType(mc.getPositionalArgument(pos), pragma[only_bind_into](path)) = type - ) - ) -} - -bindingset[trait, name] -pragma[inline_late] -private Function getImplTraitMethod(ImplTraitReturnType trait, string name) { - result = getMethodSuccessor(trait.getImplTraitTypeRepr(), name) -} - -bindingset[traitObject, name] -pragma[inline_late] -private Function getDynTraitMethod(DynTraitType traitObject, string name) { - result = getMethodSuccessor(traitObject.getTrait(), name) -} - -pragma[nomagic] -private Function resolveMethodCallTarget(MethodCall mc) { - // The method comes from an `impl` block targeting the type of the receiver. - result = getMethodFromImpl(mc) - or - // The type of the receiver is a type parameter and the method comes from a - // trait bound on the type parameter. - result = getTypeParameterMethod(mc.getTypeAt(TypePath::nil()), mc.getMethodName()) - or - // The type of the receiver is an `impl Trait` type. - result = getImplTraitMethod(mc.getTypeAt(TypePath::nil()), mc.getMethodName()) - or - // The type of the receiver is a trait object `dyn Trait` type. - result = getDynTraitMethod(mc.getTypeAt(TypePath::nil()), mc.getMethodName()) -} - -pragma[nomagic] -private predicate assocFuncResolutionDependsOnArgument(Function f, Impl impl, int pos) { - functionResolutionDependsOnArgument(impl, _, f, pos, _, _) and - not f.getParamList().hasSelfParam() -} - -private class FunctionCallExpr extends CallImpl::CallExprCall { - ItemNode getResolvedFunction() { result = CallExprImpl::getResolvedFunction(this) } - - /** - * Holds if the target of this call is ambigous, and type information is required - * to disambiguate. - */ - predicate isAmbigous() { - this.hasTrait() - or - assocFuncResolutionDependsOnArgument(this.getResolvedFunction(), _, _) - } - - /** - * Gets a target candidate of this ambigous call, which belongs to `impl`. - * - * In order for the candidate to be a match, the argument type at `pos` must be - * checked against the type of the function at the same position. - * - * `resolved` is the corresponding function resolved through path resolution. - */ - pragma[nomagic] - Function getAnAmbigousCandidate(ImplItemNode impl, int pos, Function resolved) { - resolved = this.getResolvedFunction() and - ( - exists(TraitItemNode trait | - trait = this.getTrait() and - result.implements(resolved) and - result = impl.getAnAssocItem() - | - assocFuncResolutionDependsOnArgument(result, impl, pos) - or - exists(TypeParameter tp | traitTypeParameterOccurrence(trait, resolved, _, pos, _, tp) | - pos >= 0 - or - // We only check that the context of the call provides relevant type information - // when no argument can - not traitTypeParameterOccurrence(trait, resolved, _, any(int pos0 | pos0 >= 0), _, tp) - ) - ) - or - result = resolved and - assocFuncResolutionDependsOnArgument(result, impl, pos) - ) - } - - /** - * Same as `getAnAmbigousCandidate`, ranks the positions to be checked. - */ - Function getAnAmbigousCandidateRanked(ImplItemNode impl, int pos, Function f, int rnk) { - pos = rank[rnk + 1](int pos0 | result = this.getAnAmbigousCandidate(impl, pos0, f) | pos0) - } -} - -private newtype TAmbigousAssocFunctionCallExpr = - MkAmbigousAssocFunctionCallExpr(FunctionCallExpr call, Function resolved, int pos) { - exists(call.getAnAmbigousCandidate(_, pos, resolved)) - } - -private class AmbigousAssocFunctionCallExpr extends MkAmbigousAssocFunctionCallExpr { - FunctionCallExpr call; - Function resolved; - int pos; - - AmbigousAssocFunctionCallExpr() { this = MkAmbigousAssocFunctionCallExpr(call, resolved, pos) } - - pragma[nomagic] - Type getTypeAt(TypePath path) { - result = inferType(call.(CallExpr).getArg(pos), path) - or - pos = -1 and - result = inferType(call, path) - } - - string toString() { result = call.toString() } - - Location getLocation() { result = call.getLocation() } -} - -private module AmbigousAssocFuncIsInstantiationOfInput implements - IsInstantiationOfInputSig -{ - pragma[nomagic] - predicate potentialInstantiationOf( - AmbigousAssocFunctionCallExpr ce, TypeAbstraction impl, TypeMention constraint - ) { - exists(FunctionCallExpr call, Function resolved, Function cand, int pos | - ce = MkAmbigousAssocFunctionCallExpr(call, resolved, pos) and - cand = call.getAnAmbigousCandidate(impl, pos, resolved) - | - constraint = cand.getParam(pos).getTypeRepr() - or - pos = -1 and - constraint = cand.getRetType().getTypeRepr() - ) - } -} - -/** - * Gets the target of `call`, where resolution does not rely on type inference. - */ -pragma[nomagic] -private ItemNode resolveUnambigousFunctionCallTarget(FunctionCallExpr call) { - result = call.getResolvedFunction() and - not call.isAmbigous() -} - -pragma[nomagic] -private Function resolveAmbigousFunctionCallTargetFromIndex(FunctionCallExpr call, int index) { - exists(Impl impl, int pos, Function resolved | - IsInstantiationOf::isInstantiationOf(MkAmbigousAssocFunctionCallExpr(call, - resolved, pos), impl, _) and - result = call.getAnAmbigousCandidateRanked(impl, pos, resolved, index) - | - index = 0 - or - result = resolveAmbigousFunctionCallTargetFromIndex(call, index - 1) - ) -} - -/** - * Gets the target of `call`, where resolution relies on type inference. - */ -pragma[nomagic] -private Function resolveAmbigousFunctionCallTarget(FunctionCallExpr call) { - result = - resolveAmbigousFunctionCallTargetFromIndex(call, - max(int index | result = call.getAnAmbigousCandidateRanked(_, _, _, index))) -} - -pragma[inline] -private ItemNode resolveFunctionCallTarget(FunctionCallExpr call) { - result = resolveUnambigousFunctionCallTarget(call) - or - result = resolveAmbigousFunctionCallTarget(call) -} - cached private module Cached { private import codeql.rust.internal.CachedStages @@ -2323,33 +2841,28 @@ private module Cached { /** Holds if `receiver` is the receiver of a method call with an implicit dereference. */ cached predicate receiverHasImplicitDeref(AstNode receiver) { - exists(CallExprBaseMatchingInput::Access a, CallExprBaseMatchingInput::AccessPosition apos | - apos.getArgumentPosition().isSelf() and - apos.isBorrowed(_) and - receiver = a.getNodeAt(apos) and - inferType(receiver) = TRefType() and - CallExprBaseMatching::inferAccessType(a, apos, TypePath::nil()) != TRefType() - ) + exists(MethodCallResolution::MethodCall mc | mc.receiverHasImplicitDeref(receiver)) } /** Holds if `receiver` is the receiver of a method call with an implicit borrow. */ cached predicate receiverHasImplicitBorrow(AstNode receiver) { - exists(CallExprBaseMatchingInput::Access a, CallExprBaseMatchingInput::AccessPosition apos | - apos.getArgumentPosition().isSelf() and - apos.isBorrowed(_) and - receiver = a.getNodeAt(apos) and - CallExprBaseMatching::inferAccessType(a, apos, TypePath::nil()) = TRefType() and - inferType(receiver) != TRefType() + exists(MethodCallResolution::MethodCall mc | mc.receiverHasImplicitBorrow(receiver)) + or + exists(OperationResolution::Op op | + op.(Call).implicitBorrowAt(CallImpl::TSelfArgumentPosition(), true) and + receiver = op.getOperand(0) ) } /** Gets a function that `call` resolves to, if any. */ cached Function resolveCallTarget(Call call) { - result = resolveMethodCallTarget(call) + result = call.(MethodCallResolution::MethodCall).resolveCallTarget(_) + or + result = call.(FunctionCallResolution::FunctionCall).resolveCallTarget() or - result = resolveFunctionCallTarget(call) + result = call.(OperationResolution::Op).resolveCallTarget() } /** @@ -2426,13 +2939,17 @@ private module Cached { or result = inferTypeEquality(n, path) or - result = inferImplicitSelfType(n, path) + result = n.(SelfParameterImplicitMention).resolveTypeAt(path) or result = inferStructExprType(n, path) or result = inferPathExprType(n, path) or - result = inferCallExprBaseType(n, path) + result = inferMethodCallExprType(n, path) + or + result = inferCallExprType(n, path) + or + result = inferOperationType(n, path) or result = inferFieldExprType(n, path) or @@ -2466,11 +2983,13 @@ Type inferType(AstNode n) { result = inferType(n, TypePath::nil()) } /** Provides predicates for debugging the type inference implementation. */ private module Debug { - private Locatable getRelevantLocatable() { + Locatable getRelevantLocatable() { exists(string filepath, int startline, int startcolumn, int endline, int endcolumn | result.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) and - filepath.matches("%/sqlx.rs") and - startline = [56 .. 60] + // filepath.matches("%/crates/wdk-macros/src/lib.rs") and + // endline = [255 .. 256] + filepath.matches("%/main.rs") and + startline = 2318 ) } @@ -2491,14 +3010,13 @@ private module Debug { Input2::conditionSatisfiesConstraint(abs, condition, constraint) } - predicate debugInferImplicitSelfType(SelfParam self, TypePath path, Type t) { - self = getRelevantLocatable() and - t = inferImplicitSelfType(self, path) - } - - predicate debugInferCallExprBaseType(AstNode n, TypePath path, Type t) { + // predicate debugInferImplicitSelfType(SelfParam self, TypePath path, Type t) { + // self = getRelevantLocatable() and + // t = inferImplicitSelfType(self, path) + // } + predicate debuginferMethodCallExprType(AstNode n, TypePath path, Type t) { n = getRelevantLocatable() and - t = inferCallExprBaseType(n, path) + t = inferMethodCallExprType(n, path) } predicate debugTypeMention(TypeMention tm, TypePath path, Type type) { @@ -2563,4 +3081,12 @@ private module Debug { n = getRelevantLocatable() and Consistency::nonUniqueCertainType(n, path, result) } + // predicate debugisMethodCall(MethodCall mc, Type rootType, string name, int arity) { + // mc = getRelevantLocatable() and + // isMethodCall(mc, rootType, name, arity) + // } + // predicate debugMethodCallHasImplCandidate(MethodCall mc, Impl impl) { + // mc = getRelevantLocatable() and + // methodCallHasImplCandidate(mc, impl) + // } } diff --git a/rust/ql/lib/codeql/rust/internal/TypeMention.qll b/rust/ql/lib/codeql/rust/internal/TypeMention.qll index c36e19842377..877246f2c3eb 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeMention.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeMention.qll @@ -12,6 +12,7 @@ abstract class TypeMention extends AstNode { abstract Type resolveTypeAt(TypePath path); /** Gets the type that this node resolves to, if any. */ + pragma[nomagic] final Type resolveType() { result = this.resolveTypeAt(TypePath::nil()) } } @@ -241,6 +242,8 @@ class NonAliasPathTypeMention extends PathTypeMention { else result = TTrait(trait) ) or + result = TUnion(resolved) + or result = TTypeParamTypeParameter(resolved) or result = TAssociatedTypeTypeParameter(resolved) @@ -327,6 +330,71 @@ class SelfTypeParameterMention extends TypeMention instanceof Name { } } +pragma[nomagic] +private Type resolveImplSelfType(Impl i, TypePath path) { + result = i.getSelfTy().(TypeMention).resolveTypeAt(path) +} + +/** + * Gets the type at `path` of the type being implemented in `i`, when + * `i` is an `impl` block, or the synthetic `Self` type parameter when + * `i` is a trait. + */ +pragma[nomagic] +Type resolveImplOrTraitType(ImplOrTraitItemNode i, TypePath path) { + result = resolveImplSelfType(i, path) + or + result = TSelfTypeParameter(i) and path.isEmpty() +} + +pragma[nomagic] +private ImplOrTraitItemNode getSelfParamEnclosingImplOrTrait(SelfParam self) { + exists(Function f | + f = result.getAnAssocItem() and + self = f.getParamList().getSelfParam() + ) +} + +/** + * An element used to represent the type of an implicitly typed `self` parameter. + */ +class SelfParameterImplicitMention extends TypeMention instanceof SelfParam { + private ImplOrTraitItemNode encl; + + SelfParameterImplicitMention() { + not super.hasTypeRepr() and + encl = getSelfParamEnclosingImplOrTrait(this) and + ( + encl instanceof Trait + or + // avoid generating a type mention if the type being implemented cannot be resolved + encl.(Impl).getSelfTy() instanceof TypeMention + ) + } + + pragma[nomagic] + private Type resolveSelfType(TypePath path) { result = resolveImplOrTraitType(encl, path) } + + pragma[nomagic] + private Type inferImplicitSelfType(TypePath path) { + if super.isRef() + then + // `fn f(&self, ...)` + path.isEmpty() and + result = TRefType() + or + exists(TypePath suffix | + result = this.resolveSelfType(suffix) and + path = TypePath::cons(TRefTypeParameter(), suffix) + ) + else + // `fn f(self, ...)` + result = this.resolveSelfType(path) + } + + override Type resolveTypeAt(TypePath typePath) { result = this.inferImplicitSelfType(typePath) } +} + class DynTraitTypeReprMention extends TypeMention instanceof DynTraitTypeRepr { private DynTraitType dynType; @@ -387,3 +455,19 @@ class DynTypeBoundListMention extends TypeMention instanceof TypeBoundList { ) } } + +class NeverTypeReprMention extends TypeMention, NeverTypeRepr { + override Type resolveTypeAt(TypePath path) { result = TNeverType() and path.isEmpty() } +} + +class PtrTypeReprMention extends TypeMention instanceof PtrTypeRepr { + override Type resolveTypeAt(TypePath path) { + path.isEmpty() and + result = TPtrType() + or + exists(TypePath suffix | + result = super.getTypeRepr().(TypeMention).resolveTypeAt(suffix) and + path = TypePath::cons(TPtrTypeParameter(), suffix) + ) + } +} diff --git a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/TypeInferenceConsistency.expected deleted file mode 100644 index 416404c2bd19..000000000000 --- a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/TypeInferenceConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -illFormedTypeMention -| macro_expansion.rs:99:7:99:19 | MyDeriveUnion | diff --git a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected index ffb9b672487c..d86dc212c738 100644 --- a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected @@ -1,7 +1,11 @@ multipleCallTargets | dereference.rs:69:15:69:24 | e1.deref() | +| dereference.rs:182:17:182:26 | ... .foo() | +| dereference.rs:183:17:183:23 | S.foo() | +| dereference.rs:184:17:184:30 | ... .foo() | | dereference.rs:186:17:186:25 | S.bar(...) | | dereference.rs:187:17:187:29 | S.bar(...) | +| main.rs:1803:13:1803:63 | ... .partial_cmp(...) | | main.rs:2372:13:2372:31 | ...::from(...) | | main.rs:2373:13:2373:31 | ...::from(...) | | main.rs:2374:13:2374:31 | ...::from(...) | diff --git a/rust/ql/test/library-tests/type-inference/dereference.rs b/rust/ql/test/library-tests/type-inference/dereference.rs index 6e57fc20c19a..bdc42180a63d 100644 --- a/rust/ql/test/library-tests/type-inference/dereference.rs +++ b/rust/ql/test/library-tests/type-inference/dereference.rs @@ -66,7 +66,7 @@ fn explicit_polymorphic_dereference() { fn explicit_ref_dereference() { // Explicit dereference with type parameter let e1 = &'a'; - let _f1 = e1.deref(); // $ target=deref MISSING: type=_f1:&T.char + let _f1 = e1.deref(); // $ target=deref type=_f1:&T.char // Explicit dereference with type parameter let e2 = &'a'; @@ -179,9 +179,9 @@ mod ref_vs_mut_ref { } pub fn test() { - let x = (&S).foo(); // $ MISSING: target=MyTrait1::foo1 type=x:S - let y = S.foo(); // $ MISSING: target=MyTrait1::foo1 type=y:S - let z = (&mut S).foo(); // $ MISSING: target=MyTrait1::foo2 type=z:i64 + let x = (&S).foo(); // $ target=MyTrait1::foo1 type=x:S $ SPURIOUS: target=MyTrait1::foo2 + let y = S.foo(); // $ target=MyTrait1::foo1 type=y:S $ SPURIOUS: target=MyTrait1::foo2 + let z = (&mut S).foo(); // $ target=MyTrait1::foo2 type=z:i64 $ SPURIOUS: target=MyTrait1::foo1 let x = S.bar(&S); // $ target=MyTrait2::bar1 type=x:S $ SPURIOUS: target=MyTrait2::bar2 let y = S.bar(&mut S); // $ target=MyTrait2::bar2 type=y:i64 $ SPURIOUS: target=MyTrait2::bar1 diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index 1a32a7c229a2..339bef1d2a90 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -1384,12 +1384,12 @@ mod method_call_type_conversion { let my_thing = &MyInt { a: 37 }; // implicit borrow of a `&` - let a = my_thing.method_on_borrow(); // $ MISSING: target=MyInt::method_on_borrow + let a = my_thing.method_on_borrow(); // $ target=MyInt::method_on_borrow println!("{:?}", a); // no implicit borrow let my_thing = &MyInt { a: 38 }; - let a = my_thing.method_not_on_borrow(); // $ MISSING: target=MyInt::method_not_on_borrow + let a = my_thing.method_not_on_borrow(); // $ target=MyInt::method_not_on_borrow println!("{:?}", a); } } 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 f33254c5dba2..9c297947c7bc 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -294,16 +294,15 @@ inferType | dereference.rs:63:17:63:18 | c3 | T | {EXTERNAL LOCATION} | i64 | | dereference.rs:68:9:68:10 | e1 | | file://:0:0:0:0 | & | | dereference.rs:68:9:68:10 | e1 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:68:9:68:10 | e1 | &T | file://:0:0:0:0 | & | | dereference.rs:68:14:68:17 | &'a' | | file://:0:0:0:0 | & | | dereference.rs:68:14:68:17 | &'a' | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:68:14:68:17 | &'a' | &T | file://:0:0:0:0 | & | | dereference.rs:68:15:68:17 | 'a' | | {EXTERNAL LOCATION} | char | | dereference.rs:69:9:69:11 | _f1 | | file://:0:0:0:0 | & | +| dereference.rs:69:9:69:11 | _f1 | &T | {EXTERNAL LOCATION} | char | | dereference.rs:69:15:69:16 | e1 | | file://:0:0:0:0 | & | | dereference.rs:69:15:69:16 | e1 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:69:15:69:16 | e1 | &T | file://:0:0:0:0 | & | | dereference.rs:69:15:69:24 | e1.deref() | | file://:0:0:0:0 | & | +| dereference.rs:69:15:69:24 | e1.deref() | &T | {EXTERNAL LOCATION} | char | | dereference.rs:72:9:72:10 | e2 | | file://:0:0:0:0 | & | | dereference.rs:72:9:72:10 | e2 | &T | {EXTERNAL LOCATION} | char | | dereference.rs:72:14:72:17 | &'a' | | file://:0:0:0:0 | & | @@ -485,14 +484,26 @@ inferType | dereference.rs:176:42:178:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | dereference.rs:177:13:177:14 | 42 | | {EXTERNAL LOCATION} | i32 | | dereference.rs:177:13:177:14 | 42 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:182:13:182:13 | x | | dereference.rs:147:5:147:13 | S | +| dereference.rs:182:13:182:13 | x | | {EXTERNAL LOCATION} | i64 | | dereference.rs:182:17:182:20 | (...) | | file://:0:0:0:0 | & | | dereference.rs:182:17:182:20 | (...) | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:182:17:182:26 | ... .foo() | | dereference.rs:147:5:147:13 | S | +| dereference.rs:182:17:182:26 | ... .foo() | | {EXTERNAL LOCATION} | i64 | | dereference.rs:182:18:182:19 | &S | | file://:0:0:0:0 | & | | dereference.rs:182:18:182:19 | &S | &T | dereference.rs:147:5:147:13 | S | | dereference.rs:182:19:182:19 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:183:13:183:13 | y | | dereference.rs:147:5:147:13 | S | +| dereference.rs:183:13:183:13 | y | | {EXTERNAL LOCATION} | i64 | | dereference.rs:183:17:183:17 | S | | dereference.rs:147:5:147:13 | S | +| dereference.rs:183:17:183:23 | S.foo() | | dereference.rs:147:5:147:13 | S | +| dereference.rs:183:17:183:23 | S.foo() | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:184:13:184:13 | z | | dereference.rs:147:5:147:13 | S | +| dereference.rs:184:13:184:13 | z | | {EXTERNAL LOCATION} | i64 | | dereference.rs:184:17:184:24 | (...) | | file://:0:0:0:0 | & | | dereference.rs:184:17:184:24 | (...) | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:184:17:184:30 | ... .foo() | | dereference.rs:147:5:147:13 | S | +| dereference.rs:184:17:184:30 | ... .foo() | | {EXTERNAL LOCATION} | i64 | | dereference.rs:184:18:184:23 | &mut S | | file://:0:0:0:0 | & | | dereference.rs:184:18:184:23 | &mut S | &T | dereference.rs:147:5:147:13 | S | | dereference.rs:184:23:184:23 | S | | dereference.rs:147:5:147:13 | S | @@ -2212,6 +2223,7 @@ inferType | main.rs:1127:43:1127:82 | MacroExpr | | main.rs:1124:15:1124:17 | Snd | | main.rs:1127:50:1127:81 | "PairNone has no second elemen... | | file://:0:0:0:0 | & | | main.rs:1127:50:1127:81 | "PairNone has no second elemen... | &T | {EXTERNAL LOCATION} | str | +| main.rs:1127:50:1127:81 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | | main.rs:1127:50:1127:81 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | main.rs:1127:50:1127:81 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | main.rs:1127:50:1127:81 | MacroExpr | | main.rs:1124:15:1124:17 | Snd | @@ -2223,6 +2235,7 @@ inferType | main.rs:1128:43:1128:81 | MacroExpr | | main.rs:1124:15:1124:17 | Snd | | main.rs:1128:50:1128:80 | "PairFst has no second element... | | file://:0:0:0:0 | & | | main.rs:1128:50:1128:80 | "PairFst has no second element... | &T | {EXTERNAL LOCATION} | str | +| main.rs:1128:50:1128:80 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | | main.rs:1128:50:1128:80 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | main.rs:1128:50:1128:80 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | main.rs:1128:50:1128:80 | MacroExpr | | main.rs:1124:15:1124:17 | Snd | @@ -2563,21 +2576,17 @@ inferType | main.rs:1328:33:1328:36 | SelfParam | | main.rs:1326:5:1329:5 | Self [trait ATrait] | | main.rs:1334:29:1334:33 | SelfParam | | file://:0:0:0:0 | & | | main.rs:1334:29:1334:33 | SelfParam | &T | file://:0:0:0:0 | & | -| main.rs:1334:29:1334:33 | SelfParam | &T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1334:29:1334:33 | SelfParam | &T.&T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1334:43:1336:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:1335:13:1335:22 | (...) | | main.rs:1307:5:1310:5 | MyInt | | main.rs:1335:13:1335:24 | ... .a | | {EXTERNAL LOCATION} | i64 | | main.rs:1335:14:1335:21 | * ... | | main.rs:1307:5:1310:5 | MyInt | | main.rs:1335:15:1335:21 | (...) | | file://:0:0:0:0 | & | -| main.rs:1335:15:1335:21 | (...) | | main.rs:1307:5:1310:5 | MyInt | | main.rs:1335:15:1335:21 | (...) | &T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1335:16:1335:20 | * ... | | file://:0:0:0:0 | & | -| main.rs:1335:16:1335:20 | * ... | | main.rs:1307:5:1310:5 | MyInt | | main.rs:1335:16:1335:20 | * ... | &T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1335:17:1335:20 | self | | file://:0:0:0:0 | & | | main.rs:1335:17:1335:20 | self | &T | file://:0:0:0:0 | & | -| main.rs:1335:17:1335:20 | self | &T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1335:17:1335:20 | self | &T.&T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1339:33:1339:36 | SelfParam | | file://:0:0:0:0 | & | | main.rs:1339:33:1339:36 | SelfParam | &T | main.rs:1307:5:1310:5 | MyInt | @@ -2759,12 +2768,15 @@ inferType | main.rs:1385:25:1385:39 | MyInt {...} | | main.rs:1307:5:1310:5 | MyInt | | main.rs:1385:36:1385:37 | 37 | | {EXTERNAL LOCATION} | i32 | | main.rs:1385:36:1385:37 | 37 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1387:13:1387:13 | a | | {EXTERNAL LOCATION} | i64 | | main.rs:1387:17:1387:24 | my_thing | | file://:0:0:0:0 | & | | main.rs:1387:17:1387:24 | my_thing | &T | main.rs:1307:5:1310:5 | MyInt | +| main.rs:1387:17:1387:43 | my_thing.method_on_borrow() | | {EXTERNAL LOCATION} | i64 | | main.rs:1388:18:1388:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1388:18:1388:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | | main.rs:1388:18:1388:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | main.rs:1388:18:1388:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1388:26:1388:26 | a | | {EXTERNAL LOCATION} | i64 | | main.rs:1391:13:1391:20 | my_thing | | file://:0:0:0:0 | & | | main.rs:1391:13:1391:20 | my_thing | &T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1391:24:1391:39 | &... | | file://:0:0:0:0 | & | @@ -2772,12 +2784,15 @@ inferType | main.rs:1391:25:1391:39 | MyInt {...} | | main.rs:1307:5:1310:5 | MyInt | | main.rs:1391:36:1391:37 | 38 | | {EXTERNAL LOCATION} | i32 | | main.rs:1391:36:1391:37 | 38 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1392:13:1392:13 | a | | {EXTERNAL LOCATION} | i64 | | main.rs:1392:17:1392:24 | my_thing | | file://:0:0:0:0 | & | | main.rs:1392:17:1392:24 | my_thing | &T | main.rs:1307:5:1310:5 | MyInt | +| main.rs:1392:17:1392:47 | my_thing.method_not_on_borrow() | | {EXTERNAL LOCATION} | i64 | | main.rs:1393:18:1393:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1393:18:1393:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | | main.rs:1393:18:1393:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | main.rs:1393:18:1393:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1393:26:1393:26 | a | | {EXTERNAL LOCATION} | i64 | | main.rs:1400:16:1400:20 | SelfParam | | file://:0:0:0:0 | & | | main.rs:1400:16:1400:20 | SelfParam | &T | main.rs:1398:5:1406:5 | Self [trait MyTrait] | | main.rs:1403:16:1403:20 | SelfParam | | file://:0:0:0:0 | & | @@ -2906,11 +2921,9 @@ inferType | main.rs:1476:16:1476:16 | x | | main.rs:1452:5:1452:13 | S | | main.rs:1478:13:1478:13 | n | | {EXTERNAL LOCATION} | bool | | main.rs:1478:17:1478:24 | * ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1478:18:1478:24 | * ... | | {EXTERNAL LOCATION} | bool | | main.rs:1478:18:1478:24 | * ... | | file://:0:0:0:0 | & | | main.rs:1478:18:1478:24 | * ... | &T | {EXTERNAL LOCATION} | bool | | main.rs:1478:19:1478:24 | &... | | file://:0:0:0:0 | & | -| main.rs:1478:19:1478:24 | &... | &T | {EXTERNAL LOCATION} | bool | | main.rs:1478:19:1478:24 | &... | &T | file://:0:0:0:0 | & | | main.rs:1478:19:1478:24 | &... | &T.&T | {EXTERNAL LOCATION} | bool | | main.rs:1478:20:1478:24 | &true | | file://:0:0:0:0 | & | @@ -5598,24 +5611,19 @@ inferType | pattern_matching.rs:270:11:270:26 | &mut ref_mut_val | &T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:270:16:270:26 | ref_mut_val | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:271:17:271:17 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:271:17:271:17 | x | &T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:271:17:271:17 | x | &T | file://:0:0:0:0 | & | | pattern_matching.rs:271:17:271:17 | x | &T.&T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:272:17:272:29 | ref_mut_bound | | file://:0:0:0:0 | & | -| pattern_matching.rs:272:17:272:29 | ref_mut_bound | &T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:272:17:272:29 | ref_mut_bound | &T | file://:0:0:0:0 | & | | pattern_matching.rs:272:17:272:29 | ref_mut_bound | &T.&T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:272:33:272:33 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:272:33:272:33 | x | &T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:272:33:272:33 | x | &T | file://:0:0:0:0 | & | | pattern_matching.rs:272:33:272:33 | x | &T.&T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:273:13:273:27 | * ... | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:273:13:273:32 | ... += ... | | file://:0:0:0:0 | () | -| pattern_matching.rs:273:14:273:27 | * ... | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:273:14:273:27 | * ... | | file://:0:0:0:0 | & | | pattern_matching.rs:273:14:273:27 | * ... | &T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:273:15:273:27 | ref_mut_bound | | file://:0:0:0:0 | & | -| pattern_matching.rs:273:15:273:27 | ref_mut_bound | &T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:273:15:273:27 | ref_mut_bound | &T | file://:0:0:0:0 | & | | pattern_matching.rs:273:15:273:27 | ref_mut_bound | &T.&T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:273:32:273:32 | 1 | | {EXTERNAL LOCATION} | i32 | diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index 32615dc46cd6..99d9ad436698 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -494,6 +494,12 @@ module Make1 Input1> { module Make2 { private import Input2 + final private class FinalTypeMention = TypeMention; + + final class TypeMentionTypeTree extends FinalTypeMention { + Type getTypeAt(TypePath path) { result = this.resolveTypeAt(path) } + } + /** Gets the type at the empty path of `tm`. */ bindingset[tm] pragma[inline_late] @@ -502,7 +508,7 @@ module Make1 Input1> { } /** Provides the input to `IsInstantiationOf`. */ - signature module IsInstantiationOfInputSig { + signature module IsInstantiationOfInputSig { /** * Holds if `abs` is a type abstraction, `tm` occurs in the scope of * `abs`, and `app` is potentially an application/instantiation of `abs`. @@ -523,46 +529,45 @@ module Make1 Input1> { * accessing the `bar` method of `foo` potentially instantiates the `impl` * block with a type argument for `A`. */ - predicate potentialInstantiationOf(App app, TypeAbstraction abs, TypeMention tm); + predicate potentialInstantiationOf(App app, TypeAbstraction abs, Constraint tm); /** * Holds if `constraint` might occur as the third argument of * `potentialInstantiationOf`. Defaults to simply projecting the third * argument of `potentialInstantiationOf`. */ - default predicate relevantTypeMention(TypeMention tm) { potentialInstantiationOf(_, _, tm) } + default predicate relevantTypeMention(Constraint tm) { potentialInstantiationOf(_, _, tm) } } /** * Provides functionality for determining if a type is a possible * instantiation of a type mention containing type parameters. */ - module IsInstantiationOf Input> { + module IsInstantiationOf< + HasTypeTreeSig App, HasTypeTreeSig Constraint, + IsInstantiationOfInputSig Input> + { private import Input /** Gets the `i`th path in `tm` per some arbitrary order. */ pragma[nomagic] - private TypePath getNthPath(TypeMention tm, int i) { + private TypePath getNthPath(Constraint tm, int i) { result = - rank[i + 1](TypePath path | - exists(tm.resolveTypeAt(path)) and relevantTypeMention(tm) - | - path - ) + rank[i + 1](TypePath path | exists(tm.getTypeAt(path)) and relevantTypeMention(tm) | path) } pragma[nomagic] private Type resolveNthTypeAt( - App app, TypeAbstraction abs, TypeMention tm, int i, TypePath path + App app, TypeAbstraction abs, Constraint tm, int i, TypePath path ) { potentialInstantiationOf(app, abs, tm) and path = getNthPath(tm, i) and - result = tm.resolveTypeAt(path) + result = tm.getTypeAt(path) } pragma[nomagic] private predicate satisfiesConcreteTypesFromIndex( - App app, TypeAbstraction abs, TypeMention tm, int i + App app, TypeAbstraction abs, Constraint tm, int i ) { exists(Type t, TypePath path | t = resolveNthTypeAt(app, abs, tm, i, path) and @@ -574,7 +579,7 @@ module Make1 Input1> { /** Holds if all the concrete types in `tm` also occur in `app`. */ pragma[nomagic] - private predicate satisfiesConcreteTypes(App app, TypeAbstraction abs, TypeMention tm) { + private predicate satisfiesConcreteTypes(App app, TypeAbstraction abs, Constraint tm) { satisfiesConcreteTypesFromIndex(app, abs, tm, max(int i | exists(getNthPath(tm, i)))) } @@ -592,14 +597,14 @@ module Make1 Input1> { * arbitrary order, if any. */ pragma[nomagic] - private TypePath getNthTypeParameterPath(TypeMention tm, TypeParameter tp, int i) { + private TypePath getNthTypeParameterPath(Constraint tm, TypeParameter tp, int i) { result = - rank[i + 1](TypePath path | tp = tm.resolveTypeAt(path) and relevantTypeMention(tm) | path) + rank[i + 1](TypePath path | tp = tm.getTypeAt(path) and relevantTypeMention(tm) | path) } pragma[nomagic] private predicate typeParametersEqualFromIndexBase( - App app, TypeAbstraction abs, TypeMention tm, TypeParameter tp, TypePath path + App app, TypeAbstraction abs, Constraint tm, TypeParameter tp, TypePath path ) { path = getNthTypeParameterPath(tm, tp, 0) and satisfiesConcreteTypes(app, abs, tm) and @@ -609,7 +614,7 @@ module Make1 Input1> { pragma[nomagic] private predicate typeParametersEqualFromIndex( - App app, TypeAbstraction abs, TypeMention tm, TypeParameter tp, Type t, int i + App app, TypeAbstraction abs, Constraint tm, TypeParameter tp, Type t, int i ) { exists(TypePath path | t = app.getTypeAt(path) and @@ -623,7 +628,7 @@ module Make1 Input1> { } private predicate typeParametersEqual( - App app, TypeAbstraction abs, TypeMention tm, TypeParameter tp + App app, TypeAbstraction abs, Constraint tm, TypeParameter tp ) { satisfiesConcreteTypes(app, abs, tm) and tp = getNthTypeParameter(abs, _) and @@ -639,7 +644,7 @@ module Make1 Input1> { } private predicate typeParametersHaveEqualInstantiationFromIndex( - App app, TypeAbstraction abs, TypeMention tm, int i + App app, TypeAbstraction abs, Constraint tm, int i ) { exists(TypeParameter tp | tp = getNthTypeParameter(abs, i) | typeParametersEqual(app, abs, tm, tp) and @@ -662,7 +667,7 @@ module Make1 Input1> { * - `Pair` is _not_ an instantiation of `Pair` */ pragma[nomagic] - predicate isInstantiationOf(App app, TypeAbstraction abs, TypeMention tm) { + predicate isInstantiationOf(App app, TypeAbstraction abs, Constraint tm) { // We only need to check equality if the concrete types are satisfied. satisfiesConcreteTypes(app, abs, tm) and // Check if all the places where the same type parameter occurs in `tm` @@ -684,7 +689,7 @@ module Make1 Input1> { * Holds if `app` is _not_ a possible instantiation of `tm`. */ pragma[nomagic] - predicate isNotInstantiationOf(App app, TypeAbstraction abs, TypeMention tm) { + predicate isNotInstantiationOf(App app, TypeAbstraction abs, Constraint tm) { // `app` and `tm` differ on a concrete type exists(Type t, TypePath path | t = resolveNthTypeAt(app, abs, tm, _, path) and @@ -692,13 +697,35 @@ module Make1 Input1> { not path.isEmpty() and app.getTypeAt(path) != t ) - or - // `app` uses inconsistent type parameter instantiations - exists(TypeParameter tp | - potentialInstantiationOf(app, abs, tm) and - app.getTypeAt(getNthTypeParameterPath(tm, tp, _)) != - app.getTypeAt(getNthTypeParameterPath(tm, tp, _)) + // or + // // `app` uses inconsistent type parameter instantiations + // exists(TypeParameter tp, Type t1, Type t2 | + // potentialInstantiationOf(app, abs, tm) and + // t1 = app.getTypeAt(getNthTypeParameterPath(tm, tp, _)) and + // t2 = app.getTypeAt(getNthTypeParameterPath(tm, tp, _)) and + // t1 != t2 + // ) + } + + /** + * Holds if `app` is _not_ a possible instantiation of `tm`. + */ + pragma[nomagic] + predicate isNotInstantiationOfStrict(App app, TypeAbstraction abs, Constraint tm) { + // `app` and `tm` differ on a concrete type + exists(Type t, TypePath path | + t = resolveNthTypeAt(app, abs, tm, _, path) and + not t = abs.getATypeParameter() and + app.getTypeAt(path) != t ) + // or + // // `app` uses inconsistent type parameter instantiations + // exists(TypeParameter tp, Type t1, Type t2 | + // potentialInstantiationOf(app, abs, tm) and + // t1 = app.getTypeAt(getNthTypeParameterPath(tm, tp, _)) and + // t2 = app.getTypeAt(getNthTypeParameterPath(tm, tp, _)) and + // t1 != t2 + // ) } } @@ -721,14 +748,8 @@ module Make1 Input1> { ) } - final private class FinalTypeMention = TypeMention; - - final private class TypeMentionTypeTree extends FinalTypeMention { - Type getTypeAt(TypePath path) { result = this.resolveTypeAt(path) } - } - private module IsInstantiationOfInput implements - IsInstantiationOfInputSig + IsInstantiationOfInputSig { pragma[nomagic] private predicate typeCondition( @@ -745,7 +766,7 @@ module Make1 Input1> { } predicate potentialInstantiationOf( - TypeMentionTypeTree constraint, TypeAbstraction abs, TypeMention condition + TypeMentionTypeTree constraint, TypeAbstraction abs, TypeMentionTypeTree condition ) { exists(Type type | typeConstraint(type, constraint) and typeCondition(type, abs, condition) @@ -769,7 +790,7 @@ module Make1 Input1> { conditionSatisfiesConstraint(abs, condition, midConstraint) and // NOTE: `midAbs` describe the free type variables in `midCondition`, hence // we use that for instantiation check. - IsInstantiationOf::isInstantiationOf(midConstraint, + IsInstantiationOf::isInstantiationOf(midConstraint, midAbs, midCondition) | conditionSatisfiesConstraintTypeAt(midAbs, midCondition, constraint, path, t) and @@ -933,8 +954,12 @@ module Make1 Input1> { relevantConstraint(term, constraint) } - private module IsInstantiationOfInput implements IsInstantiationOfInputSig { - predicate potentialInstantiationOf(HasTypeTree tt, TypeAbstraction abs, TypeMention cond) { + private module IsInstantiationOfInput implements + IsInstantiationOfInputSig + { + predicate potentialInstantiationOf( + HasTypeTree tt, TypeAbstraction abs, TypeMentionTypeTree cond + ) { exists(Type constraint, Type type | hasTypeConstraint(tt, type, constraint) and rootTypesSatisfaction(type, constraint, abs, cond, _) and @@ -943,7 +968,7 @@ module Make1 Input1> { ) } - predicate relevantTypeMention(TypeMention constraint) { + predicate relevantTypeMention(TypeMentionTypeTree constraint) { rootTypesSatisfaction(_, _, _, constraint, _) } } @@ -969,8 +994,8 @@ module Make1 Input1> { // one where the type instantiates the precondition. if multipleConstraintImplementations(type, constraint) then - IsInstantiationOf::isInstantiationOf(tt, abs, - condition) + IsInstantiationOf::isInstantiationOf(tt, + abs, condition) else any() ) } @@ -1018,8 +1043,8 @@ module Make1 Input1> { } } - /** Provides the input to `Matching`. */ - signature module MatchingInputSig { + /** Provides the input to `MatchingWithState`. */ + signature module MatchingWithStateInputSig { /** * A position inside a declaration. For example, the integer position of a * parameter inside a method or the return type of a method. @@ -1064,6 +1089,12 @@ module Make1 Input1> { string toString(); } + bindingset[this] + class State { + bindingset[this] + string toString(); + } + /** An access that targets a declaration, for example a method call. */ class Access { /** Gets a textual representation of this access. */ @@ -1087,10 +1118,11 @@ module Make1 Input1> { * For example, if this access is the method call `M(42)`, then the inferred * type at argument position `0` is `int`. */ - Type getInferredType(AccessPosition apos, TypePath path); + bindingset[state] + Type getInferredType(State state, AccessPosition apos, TypePath path); /** Gets the declaration that this access targets. */ - Declaration getTarget(); + Declaration getTarget(State state); } /** Holds if `apos` and `dpos` match. */ @@ -1128,7 +1160,7 @@ module Make1 Input1> { * * Matching takes both base types and explicit type arguments into account. */ - module Matching { + module MatchingWithState { private import Input /** @@ -1137,11 +1169,11 @@ module Make1 Input1> { */ pragma[nomagic] private predicate adjustedAccessType( - Access a, AccessPosition apos, Declaration target, TypePath path, Type t + Access a, State state, AccessPosition apos, Declaration target, TypePath path, Type t ) { - target = a.getTarget() and + target = a.getTarget(state) and exists(TypePath path0, Type t0 | - t0 = a.getInferredType(apos, path0) and + t0 = a.getInferredType(state, apos, path0) and adjustAccessType(apos, target, path0, t0, path, t) ) } @@ -1170,13 +1202,13 @@ module Make1 Input1> { */ pragma[nomagic] private predicate directTypeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, State state, Declaration target, TypePath path, Type t, TypeParameter tp ) { not exists(getTypeArgument(a, target, tp, _)) and exists(AccessPosition apos, DeclarationPosition dpos, TypePath pathToTypeParam | tp = target.getDeclaredType(dpos, pathToTypeParam) and accessDeclarationPositionMatch(apos, dpos) and - adjustedAccessType(a, apos, target, pathToTypeParam.appendInverse(path), t) + adjustedAccessType(a, state, apos, target, pathToTypeParam.appendInverse(path), t) ) } @@ -1185,19 +1217,21 @@ module Make1 Input1> { * Holds if inferring types at `a` might depend on the type at `path` of * `apos` having `base` as a transitive base type. */ - private predicate relevantAccess(Access a, AccessPosition apos, Type base) { + private predicate relevantAccess(Access a, State state, AccessPosition apos, Type base) { exists(Declaration target, DeclarationPosition dpos | - adjustedAccessType(a, apos, target, _, _) and + adjustedAccessType(a, state, apos, target, _, _) and accessDeclarationPositionMatch(apos, dpos) and declarationBaseType(target, dpos, base, _, _) ) } pragma[nomagic] - private Type inferTypeAt(Access a, AccessPosition apos, TypeParameter tp, TypePath suffix) { - relevantAccess(a, apos, _) and + private Type inferTypeAt( + Access a, State state, AccessPosition apos, TypeParameter tp, TypePath suffix + ) { + relevantAccess(a, state, apos, _) and exists(TypePath path0 | - result = a.getInferredType(apos, path0) and + result = a.getInferredType(state, apos, path0) and path0.isCons(tp, suffix) ) } @@ -1234,15 +1268,15 @@ module Make1 Input1> { * `Base>` | `"T2.T1.T1"` | `int` */ predicate hasBaseTypeMention( - Access a, AccessPosition apos, TypeMention baseMention, TypePath path, Type t + Access a, State state, AccessPosition apos, TypeMention baseMention, TypePath path, Type t ) { - relevantAccess(a, apos, resolveTypeMentionRoot(baseMention)) and - exists(Type sub | sub = a.getInferredType(apos, TypePath::nil()) | + relevantAccess(a, state, apos, resolveTypeMentionRoot(baseMention)) and + exists(Type sub | sub = a.getInferredType(state, apos, TypePath::nil()) | baseTypeMentionHasNonTypeParameterAt(sub, baseMention, path, t) or exists(TypePath prefix, TypePath suffix, TypeParameter tp | baseTypeMentionHasTypeParameterAt(sub, baseMention, prefix, tp) and - t = inferTypeAt(a, apos, tp, suffix) and + t = inferTypeAt(a, state, apos, tp, suffix) and path = prefix.append(suffix) ) ) @@ -1251,15 +1285,18 @@ module Make1 Input1> { private module AccessConstraint { predicate relevantAccessConstraint( - Access a, Declaration target, AccessPosition apos, TypePath path, Type constraint + Access a, State state, Declaration target, AccessPosition apos, TypePath path, + Type constraint ) { - target = a.getTarget() and + target = a.getTarget(state) and typeParameterConstraintHasTypeParameter(target, apos, path, constraint, _, _) } private newtype TRelevantAccess = - MkRelevantAccess(Access a, Declaration target, AccessPosition apos, TypePath path) { - relevantAccessConstraint(a, target, apos, path, _) + MkRelevantAccess( + Access a, State state, Declaration target, AccessPosition apos, TypePath path + ) { + relevantAccessConstraint(a, state, target, apos, path, _) } /** @@ -1268,18 +1305,19 @@ module Make1 Input1> { */ private class RelevantAccess extends MkRelevantAccess { Access a; + State state; Declaration target; AccessPosition apos; TypePath path; - RelevantAccess() { this = MkRelevantAccess(a, target, apos, path) } + RelevantAccess() { this = MkRelevantAccess(a, state, target, apos, path) } Type getTypeAt(TypePath suffix) { - adjustedAccessType(a, apos, target, path.appendInverse(suffix), result) + adjustedAccessType(a, state, apos, target, path.appendInverse(suffix), result) } /** Holds if this relevant access should satisfy `constraint`. */ - Type getConstraint() { relevantAccessConstraint(a, target, apos, path, result) } + Type getConstraint() { relevantAccessConstraint(a, state, target, apos, path, result) } string toString() { result = a.toString() + ", " + apos.toString() + ", " + path.toString() @@ -1297,11 +1335,11 @@ module Make1 Input1> { } predicate satisfiesConstraintType( - Access a, Declaration target, AccessPosition apos, TypePath prefix, Type constraint, - TypePath path, Type t + Access a, State state, Declaration target, AccessPosition apos, TypePath prefix, + Type constraint, TypePath path, Type t ) { SatisfiesConstraint::satisfiesConstraintType(MkRelevantAccess(a, - target, apos, prefix), constraint, path, t) + state, target, apos, prefix), constraint, path, t) } } @@ -1311,10 +1349,10 @@ module Make1 Input1> { */ pragma[nomagic] private predicate accessBaseType( - Access a, AccessPosition apos, Type base, TypePath path, Type t + Access a, State state, AccessPosition apos, Type base, TypePath path, Type t ) { exists(TypeMention tm | - AccessBaseType::hasBaseTypeMention(a, apos, tm, path, t) and + AccessBaseType::hasBaseTypeMention(a, state, apos, tm, path, t) and base = resolveTypeMentionRoot(tm) ) } @@ -1365,12 +1403,12 @@ module Make1 Input1> { */ pragma[nomagic] private predicate baseTypeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, State state, Declaration target, TypePath path, Type t, TypeParameter tp ) { not exists(getTypeArgument(a, target, tp, _)) and - target = a.getTarget() and + target = a.getTarget(state) and exists(AccessPosition apos, DeclarationPosition dpos, Type base, TypePath pathToTypeParam | - accessBaseType(a, apos, base, pathToTypeParam.appendInverse(path), t) and + accessBaseType(a, state, apos, base, pathToTypeParam.appendInverse(path), t) and declarationBaseType(target, dpos, base, pathToTypeParam, tp) and accessDeclarationPositionMatch(apos, dpos) ) @@ -1383,9 +1421,9 @@ module Make1 Input1> { */ pragma[nomagic] private predicate explicitTypeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, State state, Declaration target, TypePath path, Type t, TypeParameter tp ) { - target = a.getTarget() and + target = a.getTarget(state) and t = getTypeArgument(a, target, tp, path) } @@ -1427,32 +1465,32 @@ module Make1 Input1> { pragma[nomagic] private predicate typeConstraintBaseTypeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, State state, Declaration target, TypePath path, Type t, TypeParameter tp ) { not exists(getTypeArgument(a, target, tp, _)) and exists(Type constraint, AccessPosition apos, TypePath pathToTp, TypePath pathToTp2 | typeParameterConstraintHasTypeParameter(target, apos, pathToTp2, constraint, pathToTp, tp) and - AccessConstraint::satisfiesConstraintType(a, target, apos, pathToTp2, constraint, + AccessConstraint::satisfiesConstraintType(a, state, target, apos, pathToTp2, constraint, pathToTp.appendInverse(path), t) ) } pragma[inline] private predicate typeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, State state, Declaration target, TypePath path, Type t, TypeParameter tp ) { // A type given at the access corresponds directly to the type parameter // at the target. - explicitTypeMatch(a, target, path, t, tp) + explicitTypeMatch(a, state, target, path, t, tp) or // We can infer the type of `tp` from one of the access positions - directTypeMatch(a, target, path, t, tp) + directTypeMatch(a, state, target, path, t, tp) or // We can infer the type of `tp` by going up the type hiearchy - baseTypeMatch(a, target, path, t, tp) + baseTypeMatch(a, state, target, path, t, tp) or // We can infer the type of `tp` by a type constraint - typeConstraintBaseTypeMatch(a, target, path, t, tp) + typeConstraintBaseTypeMatch(a, state, target, path, t, tp) } /** @@ -1494,25 +1532,168 @@ module Make1 Input1> { * `"T2.T1.T1"` | `int` */ pragma[nomagic] - Type inferAccessType(Access a, AccessPosition apos, TypePath path) { + Type inferAccessType(Access a, State state, AccessPosition apos, TypePath path) { exists(DeclarationPosition dpos | accessDeclarationPositionMatch(apos, dpos) | // A suffix of `path` leads to a type parameter in the target exists(Declaration target, TypePath prefix, TypeParameter tp, TypePath suffix | tp = target.getDeclaredType(dpos, prefix) and path = prefix.append(suffix) and - typeMatch(a, target, suffix, result, tp) + typeMatch(a, state, target, suffix, result, tp) ) or // `path` corresponds directly to a concrete type in the declaration exists(Declaration target | result = target.getDeclaredType(dpos, path) and - target = a.getTarget() and + target = a.getTarget(state) and not result instanceof TypeParameter ) ) } } + /** Provides the input to `Matching`. */ + signature module MatchingInputSig { + /** + * A position inside a declaration. For example, the integer position of a + * parameter inside a method or the return type of a method. + */ + bindingset[this] + class DeclarationPosition { + /** Gets a textual representation of this position. */ + bindingset[this] + string toString(); + } + + /** A declaration, for example a method. */ + class Declaration { + /** Gets a textual representation of this declaration. */ + string toString(); + + /** Gets the location of this declaration. */ + Location getLocation(); + + /** Gets the type parameter at position `tppos` of this declaration, if any. */ + TypeParameter getTypeParameter(TypeParameterPosition tppos); + + /** + * Gets the declared type of this declaration at `path` for position `dpos`. + * + * For example, if this declaration is the method `int M(bool b)`, + * then the declared type at parameter position `0` is `bool`, the + * declared type at the `this` position is the class type, and the + * declared return type is `int`. + */ + Type getDeclaredType(DeclarationPosition dpos, TypePath path); + } + + /** + * A position inside an access. For example, the integer position of an + * argument inside a method call. + */ + bindingset[this] + class AccessPosition { + /** Gets a textual representation of this position. */ + bindingset[this] + string toString(); + } + + /** An access that targets a declaration, for example a method call. */ + class Access { + /** Gets a textual representation of this access. */ + string toString(); + + /** Gets the location of this access. */ + Location getLocation(); + + /** + * Gets the type at `path` for the type argument at position `tapos` of + * this access, if any. + * + * For example, in a method call like `M()`, `int` is an explicit + * type argument at position `0`. + */ + Type getTypeArgument(TypeArgumentPosition tapos, TypePath path); + + /** + * Gets the inferred type at `path` for the position `apos` of this access. + * + * For example, if this access is the method call `M(42)`, then the inferred + * type at argument position `0` is `int`. + */ + Type getInferredType(AccessPosition apos, TypePath path); + + /** Gets the declaration that this access targets. */ + Declaration getTarget(); + } + + /** Holds if `apos` and `dpos` match. */ + bindingset[apos] + bindingset[dpos] + predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos); + + /** + * Holds if matching an inferred type `t` at `path` inside an access at `apos` + * against the declaration `target` means that the type should be adjusted to + * `tAdj` at `pathAdj`. + * + * For example, in + * + * ```csharp + * void M(int? i) {} + * M(42); + * ``` + * + * the inferred type of `42` is `int`, but it should be adjusted to `int?` + * when matching against `M`. + */ + bindingset[apos, target, path, t] + default predicate adjustAccessType( + AccessPosition apos, Declaration target, TypePath path, Type t, TypePath pathAdj, Type tAdj + ) { + pathAdj = path and + tAdj = t + } + } + + /** + * Provides logic for matching types at accesses against types at the + * declarations that the accesses target. + * + * Matching takes both base types and explicit type arguments into account. + */ + module Matching { + private module Inp implements MatchingWithStateInputSig { + private import codeql.util.Unit + import Input + + predicate adjustAccessType = Input::adjustAccessType/6; + + class State = Unit; + + final private class AccessFinal = Input::Access; + + class Access extends AccessFinal { + Type getInferredType(State state, AccessPosition apos, TypePath path) { + exists(state) and + result = super.getInferredType(apos, path) + } + + Declaration getTarget(State state) { + exists(state) and + result = super.getTarget() + } + } + } + + private module M = MatchingWithState; + + import M + + Type inferAccessType(Input::Access a, Input::AccessPosition apos, TypePath path) { + result = M::inferAccessType(a, _, apos, path) + } + } + /** Provides consistency checks. */ module Consistency { query predicate missingTypeParameterId(TypeParameter tp) { From eb173a161f2a24a2425ad9e3fefec4e757cf850a Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 3 Sep 2025 17:35:50 +0200 Subject: [PATCH 3/3] update expected --- .../PathResolutionConsistency.expected | 2 - .../dataflow/global/viableCallable.expected | 2 - .../PathResolutionConsistency.expected | 2 - .../dataflow/local/DataFlowStep.expected | 18 +++++-- .../PathResolutionConsistency.expected | 0 .../PathResolutionConsistency.expected | 2 + .../PathResolutionConsistency.expected | 0 .../PathResolutionConsistency.expected | 20 +++++--- .../dataflow/sources/InlineFlow.expected | 11 ++++ .../PathResolutionConsistency.expected | 1 - .../strings/inline-taint-flow.expected | 21 ++++---- .../PathResolutionConsistency.expected | 9 ---- .../PathResolutionConsistency.expected | 29 ----------- .../security/CWE-022/TaintedPath.expected | 15 ++++++ .../CWE-022/TaintedPathSinks.expected | 2 + .../PathResolutionConsistency.expected | 44 ---------------- .../security/CWE-089/SqlInjection.expected | 6 --- .../PathResolutionConsistency.expected | 44 ---------------- .../CWE-312/CleartextLogging.expected | 50 +++++++------------ .../CWE-312/CleartextStorageDatabase.expected | 21 -------- .../PathResolutionConsistency.expected | 3 ++ .../PathResolutionConsistency.expected | 7 +++ .../PathResolutionConsistency.expected | 3 -- .../PathResolutionConsistency.expected | 2 + .../CaptureSummaryModels.expected | 2 + 25 files changed, 97 insertions(+), 219 deletions(-) delete mode 100644 rust/ql/test/library-tests/dataflow/global/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/library-tests/dataflow/modeled/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/library-tests/dataflow/pointers/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/library-tests/frameworks/postgres/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/utils-tests/modelgenerator/CONSISTENCY/PathResolutionConsistency.expected diff --git a/rust/ql/test/library-tests/dataflow/global/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/global/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 85ca3c35e7cd..000000000000 --- a/rust/ql/test/library-tests/dataflow/global/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| main.rs:272:14:272:29 | ...::deref(...) | diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected index 11f670aabff1..e26d70d80d63 100644 --- a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected @@ -59,8 +59,6 @@ | main.rs:212:13:212:34 | ...::new(...) | main.rs:205:5:208:5 | fn new | | main.rs:212:24:212:33 | source(...) | main.rs:1:1:3:1 | fn source | | main.rs:214:5:214:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:228:10:228:14 | * ... | main.rs:235:5:237:5 | fn deref | -| main.rs:236:11:236:15 | * ... | main.rs:235:5:237:5 | fn deref | | main.rs:242:28:242:36 | source(...) | main.rs:1:1:3:1 | fn source | | main.rs:244:13:244:17 | ... + ... | main.rs:220:5:223:5 | fn add | | main.rs:245:5:245:17 | sink(...) | main.rs:5:1:7:1 | fn sink | diff --git a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index f5f63c61593a..000000000000 --- a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| main.rs:471:18:471:24 | n.len() | diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 86bd270ba935..c293ef9ed36e 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1011,24 +1011,29 @@ readStep | main.rs:470:41:470:67 | [post] \|...\| ... | main.rs:467:9:467:20 | captured default_name | main.rs:470:41:470:67 | [post] default_name | | main.rs:470:44:470:55 | this | main.rs:467:9:467:20 | captured default_name | main.rs:470:44:470:55 | default_name | | main.rs:471:18:471:18 | [post] receiver for n | file://:0:0:0:0 | &ref | main.rs:471:18:471:18 | [post] n | -| main.rs:495:13:495:13 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:495:13:495:13 | [post] b | -| main.rs:496:18:496:18 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:496:18:496:18 | [post] b | | main.rs:507:10:507:11 | vs | file://:0:0:0:0 | element | main.rs:507:10:507:14 | vs[0] | | main.rs:508:11:508:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:508:10:508:35 | * ... | +| main.rs:508:11:508:35 | [post] receiver for ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:508:11:508:35 | [post] ... .unwrap() | | main.rs:509:11:509:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:509:10:509:35 | * ... | +| main.rs:509:11:509:35 | [post] receiver for ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:509:11:509:35 | [post] ... .unwrap() | | main.rs:511:14:511:15 | vs | file://:0:0:0:0 | element | main.rs:511:9:511:9 | v | | main.rs:514:9:514:10 | &... | file://:0:0:0:0 | &ref | main.rs:514:10:514:10 | v | | main.rs:514:15:514:23 | vs.iter() | file://:0:0:0:0 | element | main.rs:514:9:514:10 | &... | | main.rs:519:9:519:10 | &... | file://:0:0:0:0 | &ref | main.rs:519:10:519:10 | v | | main.rs:519:15:519:17 | vs2 | file://:0:0:0:0 | element | main.rs:519:9:519:10 | &... | +| main.rs:523:29:523:29 | [post] receiver for x | file://:0:0:0:0 | &ref | main.rs:523:29:523:29 | [post] x | | main.rs:523:29:523:29 | x | file://:0:0:0:0 | &ref | main.rs:523:28:523:29 | * ... | +| main.rs:524:34:524:34 | [post] receiver for x | file://:0:0:0:0 | &ref | main.rs:524:34:524:34 | [post] x | | main.rs:524:34:524:34 | x | file://:0:0:0:0 | &ref | main.rs:524:33:524:34 | * ... | | main.rs:526:14:526:27 | vs.into_iter() | file://:0:0:0:0 | element | main.rs:526:9:526:9 | v | | main.rs:532:10:532:15 | vs_mut | file://:0:0:0:0 | element | main.rs:532:10:532:18 | vs_mut[0] | | main.rs:533:11:533:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:533:10:533:39 | * ... | +| main.rs:533:11:533:39 | [post] receiver for ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:533:11:533:39 | [post] ... .unwrap() | | main.rs:534:11:534:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:534:10:534:39 | * ... | +| main.rs:534:11:534:39 | [post] receiver for ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:534:11:534:39 | [post] ... .unwrap() | | main.rs:536:9:536:14 | &mut ... | file://:0:0:0:0 | &ref | main.rs:536:14:536:14 | v | | main.rs:536:19:536:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:536:9:536:14 | &mut ... | +| main.rs:550:11:550:15 | [post] receiver for c_ref | file://:0:0:0:0 | &ref | main.rs:550:11:550:15 | [post] c_ref | | main.rs:550:11:550:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:550:10:550:15 | * ... | storeStep | main.rs:104:11:104:11 | i | file://:0:0:0:0 | &ref | main.rs:104:11:104:11 | receiver for i | @@ -1112,16 +1117,21 @@ storeStep | main.rs:458:18:458:27 | source(...) | file://:0:0:0:0 | element | main.rs:458:5:458:11 | [post] mut_arr | | main.rs:470:41:470:67 | default_name | main.rs:467:9:467:20 | captured default_name | main.rs:470:41:470:67 | \|...\| ... | | main.rs:471:18:471:18 | n | file://:0:0:0:0 | &ref | main.rs:471:18:471:18 | receiver for n | -| main.rs:495:13:495:13 | b | file://:0:0:0:0 | &ref | main.rs:495:13:495:13 | receiver for b | -| main.rs:496:18:496:18 | b | file://:0:0:0:0 | &ref | main.rs:496:18:496:18 | receiver for b | | main.rs:505:15:505:24 | source(...) | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] | | main.rs:505:27:505:27 | 2 | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] | | main.rs:505:30:505:30 | 3 | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] | | main.rs:505:33:505:33 | 4 | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] | +| main.rs:508:11:508:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:508:11:508:35 | receiver for ... .unwrap() | +| main.rs:509:11:509:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:509:11:509:35 | receiver for ... .unwrap() | +| main.rs:523:29:523:29 | x | file://:0:0:0:0 | &ref | main.rs:523:29:523:29 | receiver for x | +| main.rs:524:34:524:34 | x | file://:0:0:0:0 | &ref | main.rs:524:34:524:34 | receiver for x | | main.rs:530:23:530:32 | source(...) | file://:0:0:0:0 | element | main.rs:530:22:530:42 | [...] | | main.rs:530:35:530:35 | 2 | file://:0:0:0:0 | element | main.rs:530:22:530:42 | [...] | | main.rs:530:38:530:38 | 3 | file://:0:0:0:0 | element | main.rs:530:22:530:42 | [...] | | main.rs:530:41:530:41 | 4 | file://:0:0:0:0 | element | main.rs:530:22:530:42 | [...] | +| main.rs:533:11:533:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:533:11:533:39 | receiver for ... .unwrap() | +| main.rs:534:11:534:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:534:11:534:39 | receiver for ... .unwrap() | | main.rs:545:18:545:18 | c | file://:0:0:0:0 | &ref | main.rs:545:17:545:18 | &c | | main.rs:548:15:548:15 | b | file://:0:0:0:0 | &ref | main.rs:548:14:548:15 | &b | +| main.rs:550:11:550:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:550:11:550:15 | receiver for c_ref | | main.rs:571:27:571:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:571:22:571:28 | Some(...) | diff --git a/rust/ql/test/library-tests/dataflow/modeled/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/modeled/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected index ebe4e66e6e2a..209569d6b395 100644 --- a/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected @@ -1,2 +1,4 @@ multipleCallTargets +| main.rs:322:14:322:33 | ... .cmp(...) | +| main.rs:334:9:334:28 | ... .cmp(...) | | main.rs:362:14:362:30 | ... .lt(...) | diff --git a/rust/ql/test/library-tests/dataflow/pointers/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/pointers/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..e69de29bb2d1 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 8448e7cd99a5..a6c22d82d033 100644 --- a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected @@ -10,7 +10,14 @@ multipleCallTargets | test.rs:169:26:169:111 | ...::_print(...) | | test.rs:179:30:179:68 | ...::_print(...) | | test.rs:188:26:188:105 | ...::_print(...) | +| test.rs:217:22:217:62 | ... .read_to_end(...) | +| test.rs:223:22:223:65 | ... .read_to_string(...) | | test.rs:229:22:229:72 | ... .read_to_string(...) | +| test.rs:235:9:235:48 | ... .read_exact(...) | +| test.rs:513:22:513:50 | file.read_to_end(...) | +| test.rs:519:22:519:53 | file.read_to_string(...) | +| test.rs:639:26:639:43 | file1.chain(...) | +| test.rs:647:26:647:40 | file1.take(...) | | test.rs:697:18:697:38 | ...::_print(...) | | test.rs:702:18:702:45 | ...::_print(...) | | test.rs:720:38:720:42 | ...::_print(...) | @@ -73,11 +80,8 @@ multipleCallTargets | test.rs:977:14:977:29 | ...::_print(...) | | test.rs:979:27:979:36 | ...::_print(...) | | test.rs:980:28:980:41 | ...::_print(...) | -| web_frameworks.rs:13:14:13:22 | a.as_str() | -| web_frameworks.rs:13:14:13:23 | a.as_str() | -| web_frameworks.rs:14:14:14:24 | a.as_bytes() | -| web_frameworks.rs:14:14:14:25 | a.as_bytes() | -| web_frameworks.rs:101:14:101:23 | a.as_str() | -| web_frameworks.rs:102:14:102:25 | a.as_bytes() | -| web_frameworks.rs:158:14:158:23 | a.as_str() | -| web_frameworks.rs:159:14:159:25 | a.as_bytes() | +| test_futures_io.rs:35:26:35:63 | pinned.poll_read(...) | +| test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) | +| test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) | +| test_futures_io.rs:93:26:93:63 | pinned.poll_read(...) | +| test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected index e69de29bb2d1..18062e436613 100644 --- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected @@ -0,0 +1,11 @@ +| test.rs:319:14:319:20 | &buffer | Fixed missing result: hasTaintFlow | +| test.rs:326:14:326:20 | &buffer | Fixed missing result: hasTaintFlow | +| test.rs:333:14:333:20 | &buffer | Fixed missing result: hasTaintFlow | +| test.rs:592:14:592:20 | &buffer | Fixed missing result: hasTaintFlow="file.txt" | +| test.rs:598:14:598:20 | &buffer | Fixed missing result: hasTaintFlow="file.txt" | +| test.rs:604:14:604:20 | &buffer | Fixed missing result: hasTaintFlow="file.txt" | +| test.rs:641:14:641:20 | &buffer | Fixed missing result: hasTaintFlow="another_file.txt" | +| test.rs:641:14:641:20 | &buffer | Fixed missing result: hasTaintFlow="file.txt" | +| test.rs:649:14:649:20 | &buffer | Fixed missing result: hasTaintFlow="file.txt" | +| test_futures_io.rs:46:14:46:36 | &... | Fixed missing result: hasTaintFlow=url | +| test_futures_io.rs:104:14:104:36 | &... | Fixed missing result: hasTaintFlow=url | diff --git a/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected index b6acd6b81a70..ccda75006f94 100644 --- a/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected @@ -1,3 +1,2 @@ multipleCallTargets | main.rs:52:14:52:29 | ...::from(...) | -| main.rs:64:16:64:25 | s.as_str() | diff --git a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected index be270de025fe..b821429029b3 100644 --- a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected @@ -3,9 +3,8 @@ models | 2 | Summary: ::from; Argument[0]; ReturnValue; value | | 3 | Summary: ::add; Argument[self]; ReturnValue; value | | 4 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 5 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 6 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 7 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 5 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 6 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | edges | main.rs:26:9:26:9 | s | main.rs:27:19:27:25 | s[...] | provenance | | | main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | s | provenance | | @@ -26,37 +25,35 @@ edges | main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:2 | | main.rs:63:9:63:9 | s | main.rs:64:16:64:16 | s | provenance | | | main.rs:63:9:63:9 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:4 | -| main.rs:63:9:63:9 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:5 | | main.rs:63:13:63:22 | source(...) | main.rs:63:9:63:9 | s | provenance | | | main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:4 | -| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:5 | | main.rs:68:9:68:9 | s | main.rs:70:34:70:61 | MacroExpr | provenance | | | main.rs:68:9:68:9 | s | main.rs:73:34:73:59 | MacroExpr | provenance | | | main.rs:68:13:68:22 | source(...) | main.rs:68:9:68:9 | s | provenance | | | main.rs:70:9:70:18 | formatted1 | main.rs:71:10:71:19 | formatted1 | provenance | | | main.rs:70:22:70:62 | ...::format(...) | main.rs:70:9:70:18 | formatted1 | provenance | | -| main.rs:70:34:70:61 | MacroExpr | main.rs:70:22:70:62 | ...::format(...) | provenance | MaD:6 | +| main.rs:70:34:70:61 | MacroExpr | main.rs:70:22:70:62 | ...::format(...) | provenance | MaD:5 | | main.rs:73:9:73:18 | formatted2 | main.rs:74:10:74:19 | formatted2 | provenance | | | main.rs:73:22:73:60 | ...::format(...) | main.rs:73:9:73:18 | formatted2 | provenance | | -| main.rs:73:34:73:59 | MacroExpr | main.rs:73:22:73:60 | ...::format(...) | provenance | MaD:6 | +| main.rs:73:34:73:59 | MacroExpr | main.rs:73:22:73:60 | ...::format(...) | provenance | MaD:5 | | main.rs:76:9:76:13 | width | main.rs:77:34:77:74 | MacroExpr | provenance | | | main.rs:76:17:76:32 | source_usize(...) | main.rs:76:9:76:13 | width | provenance | | | main.rs:77:9:77:18 | formatted3 | main.rs:78:10:78:19 | formatted3 | provenance | | | main.rs:77:22:77:75 | ...::format(...) | main.rs:77:9:77:18 | formatted3 | provenance | | -| main.rs:77:34:77:74 | MacroExpr | main.rs:77:22:77:75 | ...::format(...) | provenance | MaD:6 | +| main.rs:77:34:77:74 | MacroExpr | main.rs:77:22:77:75 | ...::format(...) | provenance | MaD:5 | | main.rs:82:9:82:10 | s1 | main.rs:86:18:86:25 | MacroExpr | provenance | | | main.rs:82:9:82:10 | s1 | main.rs:87:18:87:32 | MacroExpr | provenance | | | main.rs:82:14:82:23 | source(...) | main.rs:82:9:82:10 | s1 | provenance | | | main.rs:86:10:86:16 | res | main.rs:86:18:86:25 | { ... } | provenance | | | main.rs:86:18:86:25 | ...::format(...) | main.rs:86:10:86:16 | res | provenance | | | main.rs:86:18:86:25 | ...::must_use(...) | main.rs:86:10:86:26 | MacroExpr | provenance | | -| main.rs:86:18:86:25 | MacroExpr | main.rs:86:18:86:25 | ...::format(...) | provenance | MaD:6 | -| main.rs:86:18:86:25 | { ... } | main.rs:86:18:86:25 | ...::must_use(...) | provenance | MaD:7 | +| main.rs:86:18:86:25 | MacroExpr | main.rs:86:18:86:25 | ...::format(...) | provenance | MaD:5 | +| main.rs:86:18:86:25 | { ... } | main.rs:86:18:86:25 | ...::must_use(...) | provenance | MaD:6 | | main.rs:87:10:87:16 | res | main.rs:87:18:87:32 | { ... } | provenance | | | main.rs:87:18:87:32 | ...::format(...) | main.rs:87:10:87:16 | res | provenance | | | main.rs:87:18:87:32 | ...::must_use(...) | main.rs:87:10:87:33 | MacroExpr | provenance | | -| main.rs:87:18:87:32 | MacroExpr | main.rs:87:18:87:32 | ...::format(...) | provenance | MaD:6 | -| main.rs:87:18:87:32 | { ... } | main.rs:87:18:87:32 | ...::must_use(...) | provenance | MaD:7 | +| main.rs:87:18:87:32 | MacroExpr | main.rs:87:18:87:32 | ...::format(...) | provenance | MaD:5 | +| main.rs:87:18:87:32 | { ... } | main.rs:87:18:87:32 | ...::must_use(...) | provenance | MaD:6 | nodes | main.rs:26:9:26:9 | s | semmle.label | s | | main.rs:26:13:26:22 | source(...) | semmle.label | source(...) | diff --git a/rust/ql/test/library-tests/frameworks/postgres/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/frameworks/postgres/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 52ccf4c06dc7..000000000000 --- a/rust/ql/test/library-tests/frameworks/postgres/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,9 +0,0 @@ -multipleCallTargets -| main.rs:22:18:22:31 | query.as_str() | -| main.rs:23:24:23:37 | query.as_str() | -| main.rs:25:18:25:31 | query.as_str() | -| main.rs:28:16:28:29 | query.as_str() | -| main.rs:29:20:29:33 | query.as_str() | -| main.rs:30:20:30:33 | query.as_str() | -| main.rs:32:20:32:33 | query.as_str() | -| main.rs:33:22:33:35 | query.as_str() | diff --git a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 231252364953..000000000000 --- a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,29 +0,0 @@ -multipleCallTargets -| test.rs:56:7:56:26 | ... .as_str() | -| test.rs:57:7:57:21 | ... .as_str() | -| test.rs:73:7:73:26 | ... .as_str() | -| test.rs:74:7:74:36 | ... .as_str() | -| test.rs:75:7:75:34 | ... .as_str() | -| test.rs:76:7:76:27 | ... .as_str() | -| test.rs:262:7:262:36 | ... .as_str() | -| test.rs:264:7:264:33 | ... .as_str() | -| test.rs:265:7:265:36 | ... .as_str() | -| test.rs:266:7:266:26 | ... .as_str() | -| test.rs:270:7:270:28 | ... .as_str() | -| test.rs:271:7:271:37 | ... .as_str() | -| test.rs:272:7:272:36 | ... .as_str() | -| test.rs:275:7:275:32 | ... .as_str() | -| test.rs:285:7:285:34 | ... .as_str() | -| test.rs:288:7:288:36 | ... .as_str() | -| test.rs:292:7:292:39 | ... .as_str() | -| test.rs:299:7:299:53 | ... .as_str() | -| test.rs:300:7:300:45 | ... .as_str() | -| test.rs:302:7:302:39 | ... .as_str() | -| test.rs:303:7:303:34 | ... .as_str() | -| test.rs:304:7:304:42 | ... .as_str() | -| test.rs:306:7:306:48 | ... .as_str() | -| test.rs:307:7:307:35 | ... .as_str() | -| test.rs:308:7:308:35 | ... .as_str() | -| test.rs:317:8:317:19 | num.as_str() | -| test.rs:328:8:328:19 | num.as_str() | -| test.rs:347:7:347:39 | ... .as_str() | diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected index 25f92e390de8..9101524cf981 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected @@ -1,5 +1,6 @@ #select | src/main.rs:11:5:11:22 | ...::read_to_string | src/main.rs:7:11:7:19 | file_name | src/main.rs:11:5:11:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:7:11:7:19 | file_name | user-provided value | +| src/main.rs:21:5:21:22 | ...::read_to_string | src/main.rs:15:36:15:44 | file_name | src/main.rs:21:5:21:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:15:36:15:44 | file_name | user-provided value | | src/main.rs:58:5:58:22 | ...::read_to_string | src/main.rs:50:51:50:59 | file_path | src/main.rs:58:5:58:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:50:51:50:59 | file_path | user-provided value | | src/main.rs:71:5:71:22 | ...::read_to_string | src/main.rs:63:11:63:19 | file_path | src/main.rs:71:5:71:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:63:11:63:19 | file_path | user-provided value | | src/main.rs:99:5:99:22 | ...::read_to_string | src/main.rs:90:11:90:19 | file_path | src/main.rs:99:5:99:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:90:11:90:19 | file_path | user-provided value | @@ -20,6 +21,11 @@ edges | src/main.rs:9:21:9:44 | ...::from(...) | src/main.rs:9:9:9:17 | file_path | provenance | | | src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:13 | | src/main.rs:11:24:11:32 | file_path | src/main.rs:11:5:11:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | +| src/main.rs:15:36:15:44 | file_name | src/main.rs:20:35:20:43 | file_name | provenance | | +| src/main.rs:20:9:20:17 | file_path | src/main.rs:21:24:21:32 | file_path | provenance | | +| src/main.rs:20:21:20:44 | ...::from(...) | src/main.rs:20:9:20:17 | file_path | provenance | | +| src/main.rs:20:35:20:43 | file_name | src/main.rs:20:21:20:44 | ...::from(...) | provenance | MaD:13 | +| src/main.rs:21:24:21:32 | file_path | src/main.rs:21:5:21:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:50:51:50:59 | file_path | src/main.rs:52:32:52:40 | file_path | provenance | | | src/main.rs:52:9:52:17 | file_path [&ref] | src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | provenance | Config | | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | src/main.rs:52:9:52:17 | file_path [&ref] | provenance | | @@ -134,6 +140,12 @@ nodes | src/main.rs:9:35:9:43 | file_name | semmle.label | file_name | | src/main.rs:11:5:11:22 | ...::read_to_string | semmle.label | ...::read_to_string | | src/main.rs:11:24:11:32 | file_path | semmle.label | file_path | +| src/main.rs:15:36:15:44 | file_name | semmle.label | file_name | +| src/main.rs:20:9:20:17 | file_path | semmle.label | file_path | +| src/main.rs:20:21:20:44 | ...::from(...) | semmle.label | ...::from(...) | +| src/main.rs:20:35:20:43 | file_name | semmle.label | file_name | +| src/main.rs:21:5:21:22 | ...::read_to_string | semmle.label | ...::read_to_string | +| src/main.rs:21:24:21:32 | file_path | semmle.label | file_path | | src/main.rs:50:51:50:59 | file_path | semmle.label | file_path | | src/main.rs:52:9:52:17 | file_path [&ref] | semmle.label | file_path [&ref] | | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | @@ -227,3 +239,6 @@ nodes | src/main.rs:186:17:186:22 | &path1 [&ref] | semmle.label | &path1 [&ref] | | src/main.rs:186:18:186:22 | path1 | semmle.label | path1 | subpaths +testFailures +| src/main.rs:15:36:15:44 | file_name | Unexpected result: Source | +| src/main.rs:21:5:21:22 | ...::read_to_string | Unexpected result: Alert | diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPathSinks.expected b/rust/ql/test/query-tests/security/CWE-022/TaintedPathSinks.expected index e69de29bb2d1..ee14a13f0ea3 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPathSinks.expected +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPathSinks.expected @@ -0,0 +1,2 @@ +| src/main.rs:17:90:17:116 | //... | Missing result: path-injection-barrier | +| src/main.rs:20:47:20:112 | //... | Missing result: path-injection-barrier | diff --git a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected index b5d4fea346d2..85bc216117c8 100644 --- a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected @@ -6,66 +6,22 @@ multipleCallTargets | sqlx.rs:51:24:51:77 | ...::from(...) | | sqlx.rs:55:26:55:79 | ...::from(...) | | sqlx.rs:61:28:61:81 | ...::from(...) | -| sqlx.rs:64:57:64:77 | safe_query_1.as_str() | -| sqlx.rs:65:26:65:46 | safe_query_2.as_str() | -| sqlx.rs:66:26:66:46 | safe_query_3.as_str() | -| sqlx.rs:67:26:67:48 | unsafe_query_1.as_str() | | sqlx.rs:69:30:69:52 | unsafe_query_2.as_str() | -| sqlx.rs:70:30:70:52 | unsafe_query_3.as_str() | -| sqlx.rs:75:25:75:45 | safe_query_1.as_str() | -| sqlx.rs:76:25:76:45 | safe_query_2.as_str() | -| sqlx.rs:77:25:77:45 | safe_query_3.as_str() | -| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | -| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | -| sqlx.rs:84:25:84:49 | prepared_query_1.as_str() | -| sqlx.rs:85:25:85:49 | prepared_query_1.as_str() | -| sqlx.rs:87:29:87:53 | prepared_query_1.as_str() | -| sqlx.rs:88:29:88:53 | prepared_query_1.as_str() | | sqlx.rs:99:24:99:44 | ...::from(...) | | sqlx.rs:100:97:100:117 | ...::from(...) | | sqlx.rs:101:24:101:77 | ...::from(...) | | sqlx.rs:102:26:102:79 | ...::from(...) | | sqlx.rs:103:28:103:81 | ...::from(...) | -| sqlx.rs:106:26:106:46 | safe_query_1.as_str() | -| sqlx.rs:108:30:108:52 | unsafe_query_1.as_str() | -| sqlx.rs:111:27:111:47 | safe_query_1.as_str() | -| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | -| sqlx.rs:117:25:117:45 | safe_query_1.as_str() | -| sqlx.rs:118:25:118:49 | prepared_query_1.as_str() | -| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | -| sqlx.rs:121:29:121:53 | prepared_query_1.as_str() | -| sqlx.rs:124:25:124:45 | safe_query_1.as_str() | -| sqlx.rs:125:25:125:49 | prepared_query_1.as_str() | -| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | -| sqlx.rs:128:29:128:53 | prepared_query_1.as_str() | -| sqlx.rs:131:54:131:74 | safe_query_1.as_str() | | sqlx.rs:132:14:132:34 | ...::_print(...) | -| sqlx.rs:133:54:133:78 | prepared_query_1.as_str() | | sqlx.rs:134:14:134:34 | ...::_print(...) | -| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | -| sqlx.rs:137:55:137:79 | prepared_query_1.as_str() | -| sqlx.rs:140:54:140:74 | safe_query_1.as_str() | | sqlx.rs:141:14:141:34 | ...::_print(...) | -| sqlx.rs:142:54:142:78 | prepared_query_1.as_str() | | sqlx.rs:143:14:143:34 | ...::_print(...) | -| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | -| sqlx.rs:146:55:146:79 | prepared_query_1.as_str() | -| sqlx.rs:149:25:149:45 | safe_query_1.as_str() | -| sqlx.rs:150:25:150:49 | prepared_query_1.as_str() | -| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | -| sqlx.rs:154:29:154:53 | prepared_query_1.as_str() | | sqlx.rs:172:24:172:44 | ...::from(...) | | sqlx.rs:173:97:173:117 | ...::from(...) | | sqlx.rs:174:24:174:77 | ...::from(...) | | sqlx.rs:175:26:175:79 | ...::from(...) | | sqlx.rs:176:28:176:82 | ...::from(...) | -| sqlx.rs:179:26:179:46 | safe_query_1.as_str() | -| sqlx.rs:181:30:181:52 | unsafe_query_1.as_str() | -| sqlx.rs:185:25:185:45 | safe_query_1.as_str() | -| sqlx.rs:186:25:186:49 | prepared_query_1.as_str() | -| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | -| sqlx.rs:189:29:189:53 | prepared_query_1.as_str() | | sqlx.rs:196:14:196:43 | ...::_print(...) | | sqlx.rs:202:57:202:85 | ...::from(...) | | sqlx.rs:203:14:203:46 | ...::_print(...) | diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index 2168ca56a444..15c05c78db4d 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -20,17 +20,13 @@ edges | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | provenance | MaD:8 | | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | sqlx.rs:49:9:49:21 | remote_number | provenance | | | sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:36 | safe_query_3 | provenance | | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:9 | | sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:5 | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:9 | | sqlx.rs:52:24:52:30 | res | sqlx.rs:52:32:52:87 | { ... } | provenance | | | sqlx.rs:52:32:52:87 | ...::format(...) | sqlx.rs:52:24:52:30 | res | provenance | | | sqlx.rs:52:32:52:87 | ...::must_use(...) | sqlx.rs:52:9:52:20 | safe_query_3 | provenance | | | sqlx.rs:52:32:52:87 | MacroExpr | sqlx.rs:52:32:52:87 | ...::format(...) | provenance | MaD:12 | | sqlx.rs:52:32:52:87 | { ... } | sqlx.rs:52:32:52:87 | ...::must_use(...) | provenance | MaD:13 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:5 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | | sqlx.rs:53:26:53:36 | &arg_string [&ref] | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | provenance | | | sqlx.rs:53:27:53:36 | arg_string | sqlx.rs:53:26:53:36 | &arg_string [&ref] | provenance | | | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:9 | @@ -38,9 +34,7 @@ edges | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:9 | | sqlx.rs:54:26:54:39 | &remote_string [&ref] | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | provenance | | | sqlx.rs:54:27:54:39 | remote_string | sqlx.rs:54:26:54:39 | &remote_string [&ref] | provenance | | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:9 | | sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:5 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:9 | | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:13:78:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | diff --git a/rust/ql/test/query-tests/security/CWE-312/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-312/CONSISTENCY/PathResolutionConsistency.expected index ac6f2b2d997a..5c4bb2f4fa49 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CONSISTENCY/PathResolutionConsistency.expected @@ -29,16 +29,13 @@ multipleCallTargets | test_logging.rs:75:5:75:10 | ...::max_level(...) | | test_logging.rs:76:5:76:10 | ...::max_level(...) | | test_logging.rs:77:5:77:10 | ...::max_level(...) | -| test_logging.rs:77:20:77:36 | password.as_str() | | test_logging.rs:78:5:78:10 | ...::max_level(...) | -| test_logging.rs:78:22:78:38 | password.as_str() | | test_logging.rs:81:5:81:10 | ...::max_level(...) | | test_logging.rs:82:5:82:10 | ...::max_level(...) | | test_logging.rs:83:5:83:10 | ...::max_level(...) | | test_logging.rs:84:5:84:10 | ...::max_level(...) | | test_logging.rs:85:5:85:10 | ...::max_level(...) | | test_logging.rs:86:5:86:10 | ...::max_level(...) | -| test_logging.rs:88:18:88:34 | password.as_str() | | test_logging.rs:89:5:89:10 | ...::max_level(...) | | test_logging.rs:90:5:90:10 | ...::max_level(...) | | test_logging.rs:94:5:94:9 | ...::max_level(...) | @@ -70,11 +67,6 @@ multipleCallTargets | test_logging.rs:193:14:193:37 | ...::_print(...) | | test_logging.rs:194:13:194:38 | ...::_eprint(...) | | test_logging.rs:195:15:195:38 | ...::_eprint(...) | -| test_logging.rs:229:30:229:71 | ... .as_str() | -| test_logging.rs:242:16:242:61 | ... .as_bytes() | -| test_logging.rs:245:20:245:65 | ... .as_bytes() | -| test_logging.rs:248:15:248:60 | ... .as_bytes() | -| test_logging.rs:251:15:251:60 | ... .as_bytes() | | test_storage.rs:13:10:13:33 | ...::from(...) | | test_storage.rs:17:10:17:35 | ...::from(...) | | test_storage.rs:21:10:21:35 | ...::from(...) | @@ -95,42 +87,6 @@ multipleCallTargets | test_storage.rs:80:25:80:70 | ...::from(...) | | test_storage.rs:81:25:81:72 | ...::from(...) | | test_storage.rs:82:26:82:77 | ...::from(...) | -| test_storage.rs:85:27:85:48 | select_query1.as_str() | -| test_storage.rs:86:27:86:48 | select_query2.as_str() | -| test_storage.rs:87:27:87:48 | insert_query1.as_str() | -| test_storage.rs:88:27:88:48 | insert_query2.as_str() | -| test_storage.rs:89:27:89:48 | update_query1.as_str() | -| test_storage.rs:90:27:90:48 | update_query2.as_str() | -| test_storage.rs:91:27:91:48 | update_query3.as_str() | -| test_storage.rs:92:27:92:48 | update_query4.as_str() | -| test_storage.rs:93:27:93:48 | update_query5.as_str() | -| test_storage.rs:94:27:94:48 | update_query6.as_str() | -| test_storage.rs:95:27:95:48 | delete_query1.as_str() | -| test_storage.rs:96:27:96:48 | delete_query2.as_str() | -| test_storage.rs:99:25:99:46 | insert_query1.as_str() | -| test_storage.rs:100:25:100:46 | insert_query2.as_str() | -| test_storage.rs:101:25:101:47 | prepared_query.as_str() | -| test_storage.rs:102:25:102:47 | prepared_query.as_str() | -| test_storage.rs:103:25:103:47 | prepared_query.as_str() | -| test_storage.rs:104:25:104:47 | prepared_query.as_str() | -| test_storage.rs:110:27:110:48 | insert_query1.as_str() | -| test_storage.rs:111:27:111:48 | insert_query2.as_str() | -| test_storage.rs:114:27:114:48 | insert_query1.as_str() | -| test_storage.rs:115:27:115:48 | insert_query2.as_str() | -| test_storage.rs:118:25:118:46 | insert_query1.as_str() | -| test_storage.rs:119:25:119:46 | insert_query2.as_str() | -| test_storage.rs:120:25:120:47 | prepared_query.as_str() | -| test_storage.rs:121:25:121:47 | prepared_query.as_str() | -| test_storage.rs:124:25:124:46 | insert_query1.as_str() | -| test_storage.rs:125:25:125:46 | insert_query2.as_str() | -| test_storage.rs:126:25:126:47 | prepared_query.as_str() | -| test_storage.rs:127:25:127:47 | prepared_query.as_str() | -| test_storage.rs:134:27:134:48 | insert_query1.as_str() | -| test_storage.rs:135:27:135:48 | insert_query2.as_str() | -| test_storage.rs:138:25:138:46 | insert_query1.as_str() | -| test_storage.rs:139:25:139:46 | insert_query2.as_str() | -| test_storage.rs:140:25:140:47 | prepared_query.as_str() | -| test_storage.rs:141:25:141:47 | prepared_query.as_str() | | test_storage.rs:188:29:188:86 | ...::from(...) | | test_storage.rs:189:28:189:82 | ...::from(...) | | test_storage.rs:190:28:190:81 | ...::from(...) | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 01d3b06a854e..f6d742ec3cd4 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -143,8 +143,8 @@ edges | test_logging.rs:99:14:99:20 | res | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:14:99:20 | res | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | | test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:100:5:100:9 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:5:118:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | @@ -166,8 +166,8 @@ edges | test_logging.rs:176:34:176:79 | MacroExpr | test_logging.rs:176:33:176:79 | &... [&ref] | provenance | | | test_logging.rs:176:42:176:78 | ...::format(...) | test_logging.rs:176:34:176:40 | res | provenance | | | test_logging.rs:176:42:176:78 | ...::must_use(...) | test_logging.rs:176:34:176:79 | MacroExpr | provenance | | -| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:42:176:78 | MacroExpr | provenance | | | test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:24:180:33 | log_expect | provenance | MaD:3 Sink:MaD:3 | | test_logging.rs:180:35:180:81 | &... [&ref] | test_logging.rs:180:24:180:33 | log_expect | provenance | MaD:3 Sink:MaD:3 | @@ -176,8 +176,8 @@ edges | test_logging.rs:180:36:180:81 | MacroExpr | test_logging.rs:180:35:180:81 | &... [&ref] | provenance | | | test_logging.rs:180:44:180:80 | ...::format(...) | test_logging.rs:180:36:180:42 | res | provenance | | | test_logging.rs:180:44:180:80 | ...::must_use(...) | test_logging.rs:180:36:180:81 | MacroExpr | provenance | | -| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:44:180:80 | MacroExpr | provenance | | | test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 [Err] | provenance | | | test_logging.rs:183:47:183:68 | Err(...) [Err] | test_logging.rs:183:9:183:19 | err_result2 [Err] | provenance | | @@ -229,68 +229,56 @@ edges | test_logging.rs:226:36:226:59 | MacroExpr | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | provenance | | | test_logging.rs:226:52:226:59 | password | test_logging.rs:226:36:226:59 | MacroExpr | provenance | | | test_logging.rs:229:30:229:36 | res | test_logging.rs:229:38:229:61 | { ... } | provenance | | -| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:20 | | test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:18 | -| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:20 | | test_logging.rs:229:30:229:71 | ... .as_str() | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:229:30:229:71 | ... .as_str() | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:229:38:229:61 | ...::format(...) | test_logging.rs:229:30:229:36 | res | provenance | | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:62 | MacroExpr | provenance | | -| test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:20 | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:18 | -| test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:20 | -| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:38:229:61 | MacroExpr | provenance | | | test_logging.rs:242:16:242:22 | res | test_logging.rs:242:24:242:49 | { ... } | provenance | | -| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | provenance | MaD:19 | | test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | provenance | MaD:17 | | test_logging.rs:242:16:242:61 | ... .as_bytes() | test_logging.rs:242:10:242:14 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | test_logging.rs:242:10:242:14 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:242:24:242:49 | ...::format(...) | test_logging.rs:242:16:242:22 | res | provenance | | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:50 | MacroExpr | provenance | | -| test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | MaD:19 | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | MaD:17 | -| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:24:242:49 | MacroExpr | provenance | | | test_logging.rs:245:20:245:26 | res | test_logging.rs:245:28:245:53 | { ... } | provenance | | -| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | provenance | MaD:19 | | test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | provenance | MaD:17 | | test_logging.rs:245:20:245:65 | ... .as_bytes() | test_logging.rs:245:10:245:18 | write_all | provenance | MaD:8 Sink:MaD:8 | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | test_logging.rs:245:10:245:18 | write_all | provenance | MaD:8 Sink:MaD:8 | | test_logging.rs:245:28:245:53 | ...::format(...) | test_logging.rs:245:20:245:26 | res | provenance | | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:54 | MacroExpr | provenance | | -| test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | MaD:19 | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | MaD:17 | -| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:28:245:53 | MacroExpr | provenance | | | test_logging.rs:248:15:248:21 | res | test_logging.rs:248:23:248:48 | { ... } | provenance | | -| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | provenance | MaD:19 | | test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | provenance | MaD:17 | | test_logging.rs:248:15:248:60 | ... .as_bytes() | test_logging.rs:248:9:248:13 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | test_logging.rs:248:9:248:13 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:248:23:248:48 | ...::format(...) | test_logging.rs:248:15:248:21 | res | provenance | | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:49 | MacroExpr | provenance | | -| test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | MaD:19 | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | MaD:17 | -| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:23:248:48 | MacroExpr | provenance | | | test_logging.rs:251:15:251:21 | res | test_logging.rs:251:23:251:48 | { ... } | provenance | | -| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | provenance | MaD:19 | | test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | provenance | MaD:17 | | test_logging.rs:251:15:251:60 | ... .as_bytes() | test_logging.rs:251:9:251:13 | write | provenance | MaD:6 Sink:MaD:6 | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | test_logging.rs:251:9:251:13 | write | provenance | MaD:6 Sink:MaD:6 | | test_logging.rs:251:23:251:48 | ...::format(...) | test_logging.rs:251:15:251:21 | res | provenance | | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:49 | MacroExpr | provenance | | -| test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | MaD:19 | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | MaD:17 | -| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:23:251:48 | MacroExpr | provenance | | models | 1 | Sink: ::log_expect; Argument[0]; log-injection | @@ -311,10 +299,8 @@ models | 16 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | | 17 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | | 18 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 19 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 20 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 21 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 22 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 19 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 20 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:42:5:42:10 | ...::log | semmle.label | ...::log | | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected index 028b2d88ac3d..96a4fea2e9da 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected @@ -9,54 +9,34 @@ | test_storage.rs:204:31:204:37 | prepare | test_storage.rs:190:86:190:103 | get_phone_number(...) | test_storage.rs:204:31:204:37 | prepare | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:190:86:190:103 | get_phone_number(...) | get_phone_number(...) | edges | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:100:25:100:37 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:100:25:100:46 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:100:25:100:46 | insert_query2.as_str() | provenance | MaD:7 | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:100:25:100:46 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:115:27:115:39 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:115:27:115:48 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:115:27:115:48 | insert_query2.as_str() | provenance | MaD:7 | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:115:27:115:48 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:119:25:119:37 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:119:25:119:46 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:119:25:119:46 | insert_query2.as_str() | provenance | MaD:7 | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:119:25:119:46 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:125:25:125:37 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:125:25:125:46 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:125:25:125:46 | insert_query2.as_str() | provenance | MaD:7 | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:125:25:125:46 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:139:25:139:37 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:139:25:139:46 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:139:25:139:46 | insert_query2.as_str() | provenance | MaD:7 | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:139:25:139:46 | insert_query2.as_str() | provenance | MaD:8 | | test_storage.rs:71:25:71:114 | ... + ... | test_storage.rs:71:9:71:21 | insert_query2 | provenance | | | test_storage.rs:71:25:71:114 | ... + ... | test_storage.rs:71:25:71:121 | ... + ... | provenance | MaD:6 | | test_storage.rs:71:25:71:121 | ... + ... | test_storage.rs:71:9:71:21 | insert_query2 | provenance | | | test_storage.rs:71:96:71:114 | &... | test_storage.rs:71:9:71:21 | insert_query2 | provenance | | | test_storage.rs:71:96:71:114 | &... | test_storage.rs:71:25:71:114 | ... + ... | provenance | | | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:71:96:71:114 | &... | provenance | Config | -| test_storage.rs:100:25:100:37 | insert_query2 | test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:100:25:100:37 | insert_query2 | test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | provenance | MaD:7 | -| test_storage.rs:100:25:100:37 | insert_query2 | test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:100:25:100:46 | insert_query2.as_str() | test_storage.rs:100:13:100:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | test_storage.rs:100:13:100:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | -| test_storage.rs:115:27:115:39 | insert_query2 | test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:115:27:115:39 | insert_query2 | test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | provenance | MaD:7 | -| test_storage.rs:115:27:115:39 | insert_query2 | test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:115:27:115:48 | insert_query2.as_str() | test_storage.rs:115:13:115:25 | ...::raw_sql | provenance | MaD:5 Sink:MaD:5 | | test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | test_storage.rs:115:13:115:25 | ...::raw_sql | provenance | MaD:5 Sink:MaD:5 | -| test_storage.rs:119:25:119:37 | insert_query2 | test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:119:25:119:37 | insert_query2 | test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | provenance | MaD:7 | -| test_storage.rs:119:25:119:37 | insert_query2 | test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:119:25:119:46 | insert_query2.as_str() | test_storage.rs:119:13:119:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | test_storage.rs:119:13:119:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | -| test_storage.rs:125:25:125:37 | insert_query2 | test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:125:25:125:37 | insert_query2 | test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | provenance | MaD:7 | -| test_storage.rs:125:25:125:37 | insert_query2 | test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:125:25:125:46 | insert_query2.as_str() | test_storage.rs:125:13:125:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | test_storage.rs:125:13:125:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | -| test_storage.rs:139:25:139:37 | insert_query2 | test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:139:25:139:37 | insert_query2 | test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | provenance | MaD:7 | -| test_storage.rs:139:25:139:37 | insert_query2 | test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | | test_storage.rs:139:25:139:46 | insert_query2.as_str() | test_storage.rs:139:13:139:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | test_storage.rs:139:13:139:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:189:9:189:24 | insert_query_bad | test_storage.rs:194:25:194:40 | insert_query_bad | provenance | | @@ -94,7 +74,6 @@ models | 5 | Sink: sqlx_core::raw_sql::raw_sql; Argument[0]; sql-injection | | 6 | Summary: ::add; Argument[self]; ReturnValue; value | | 7 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 8 | Summary: ::as_str; Argument[self]; ReturnValue; value | nodes | test_storage.rs:71:9:71:21 | insert_query2 | semmle.label | insert_query2 | | test_storage.rs:71:25:71:114 | ... + ... | semmle.label | ... + ... | diff --git a/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..16bbea0aba3b --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,3 @@ +multipleCallTargets +| test.rs:117:9:117:20 | ptr.is_null() | +| test.rs:117:9:117:21 | ptr.is_null() | diff --git a/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..1abeb1aeb874 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,7 @@ +multipleCallTargets +| main.rs:242:44:242:78 | ... .cast() | +| main.rs:245:44:245:78 | ... .cast() | +| main.rs:248:44:248:78 | ... .cast() | +| main.rs:251:14:251:48 | ... .cast() | +| main.rs:254:14:254:48 | ... .cast() | +| main.rs:257:14:257:48 | ... .cast() | diff --git a/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected index d13271f5fe6e..81f06adcde33 100644 --- a/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected @@ -3,7 +3,4 @@ multipleCallTargets | deallocation.rs:261:11:261:29 | ...::from(...) | | lifetime.rs:610:13:610:31 | ...::from(...) | | lifetime.rs:611:13:611:31 | ...::from(...) | -| lifetime.rs:612:27:612:38 | foo.as_str() | -| lifetime.rs:612:41:612:52 | bar.as_str() | | lifetime.rs:628:13:628:31 | ...::from(...) | -| lifetime.rs:629:32:629:43 | baz.as_str() | diff --git a/rust/ql/test/utils-tests/modelgenerator/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/utils-tests/modelgenerator/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..7f71bf2cc92a --- /dev/null +++ b/rust/ql/test/utils-tests/modelgenerator/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,2 @@ +multipleCallTargets +| option.rs:482:33:482:44 | from.clone() | diff --git a/rust/ql/test/utils-tests/modelgenerator/CaptureSummaryModels.expected b/rust/ql/test/utils-tests/modelgenerator/CaptureSummaryModels.expected index cb6fc390349c..2ef8b7ac60ae 100644 --- a/rust/ql/test/utils-tests/modelgenerator/CaptureSummaryModels.expected +++ b/rust/ql/test/utils-tests/modelgenerator/CaptureSummaryModels.expected @@ -1,2 +1,4 @@ unexpectedModel +| Unexpected summary found: ::cloned;Argument[self].Field[test::option::MyOption::MySome(0)].Reference;ReturnValue.Field[test::option::MyOption::MySome(0)];value;dfc-generated | +| Unexpected summary found: ::cloned;Argument[self].Field[test::option::MyOption::MySome(0)];ReturnValue.Field[test::option::MyOption::MySome(0)];value;dfc-generated | expectedModel