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

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy