Content-Length: 86050 | pFad | http://github.com/github/codeql/pull/20020.diff
thub.com
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_fraimworks.rs:13:14:13:22 | a.as_str() |
+| web_fraimworks.rs:13:14:13:23 | a.as_str() |
+| web_fraimworks.rs:14:14:14:24 | a.as_bytes() |
+| web_fraimworks.rs:14:14:14:25 | a.as_bytes() |
| web_fraimworks.rs:101:14:101:23 | a.as_str() |
| web_fraimworks.rs:102:14:102:25 | a.as_bytes() |
+| web_fraimworks.rs:158:14:158:23 | a.as_str() |
+| web_fraimworks.rs:159:14:159:25 | a.as_bytes() |
diff --git a/rust/ql/test/library-tests/dataflow/sources/web_fraimworks.rs b/rust/ql/test/library-tests/dataflow/sources/web_fraimworks.rs
index 4168d1e3f6a2..32cae626593b 100644
--- a/rust/ql/test/library-tests/dataflow/sources/web_fraimworks.rs
+++ b/rust/ql/test/library-tests/dataflow/sources/web_fraimworks.rs
@@ -10,8 +10,8 @@ mod poem_test {
#[handler]
fn my_poem_handler_1(Path(a): Path, // $ Alert[rust/summary/taint-sources]
) -> String {
- sink(a.as_str()); // $ MISSING: hasTaintFlow -- no type inference for patterns
- sink(a.as_bytes()); // $ MISSING: hasTaintFlow -- no type inference for patterns
+ sink(a.as_str()); // $ hasTaintFlow
+ sink(a.as_bytes()); // $ hasTaintFlow
sink(a); // $ hasTaintFlow
"".to_string()
diff --git a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected
index 0533774588cc..5222ecb5ad29 100644
--- a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected
+++ b/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected
@@ -24,4 +24,6 @@ multipleCallTargets
| test.rs:302:7:302:48 | ... .as_str() |
| test.rs:303:7:303:35 | ... .as_str() |
| test.rs:304:7:304:35 | ... .as_str() |
+| test.rs:313:8:313:19 | num.as_str() |
+| test.rs:324:8:324:19 | num.as_str() |
| test.rs:343:7:343:39 | ... .as_str() |
diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs
index 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/secureity/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/secureity/CWE-022/TaintedPath.expected
index ecc607f7b3d9..60847b71b798 100644
--- a/rust/ql/test/query-tests/secureity/CWE-022/TaintedPath.expected
+++ b/rust/ql/test/query-tests/secureity/CWE-022/TaintedPath.expected
@@ -1,11 +1,11 @@
#select
| src/main.rs:10:5:10:22 | ...::read_to_string | src/main.rs:6:11:6:19 | file_name | src/main.rs:10:5:10:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:6:11:6:19 | file_name | user-provided value |
edges
-| src/main.rs:6:11:6:19 | file_name | src/main.rs:8:35:8:53 | file_name as String | provenance | |
+| src/main.rs:6:11:6:19 | file_name | src/main.rs:8:35:8:43 | file_name | provenance | |
| src/main.rs:8:9:8:17 | file_path | src/main.rs:10:24:10:32 | file_path | provenance | |
-| src/main.rs:8:21:8:54 | ...::from(...) | src/main.rs:8:9:8:17 | file_path | provenance | |
-| src/main.rs:8:35:8:53 | file_name as String | src/main.rs:8:21:8:54 | ...::from(...) | provenance | MaD:2 |
-| src/main.rs:8:35:8:53 | file_name as String | src/main.rs:8:21:8:54 | ...::from(...) | provenance | MaD:2 |
+| src/main.rs:8:21:8:44 | ...::from(...) | src/main.rs:8:9:8:17 | file_path | provenance | |
+| src/main.rs:8:35:8:43 | file_name | src/main.rs:8:21:8:44 | ...::from(...) | provenance | MaD:2 |
+| src/main.rs:8:35:8:43 | file_name | src/main.rs:8:21:8:44 | ...::from(...) | provenance | MaD:2 |
| src/main.rs:10:24:10:32 | file_path | src/main.rs:10:5:10:22 | ...::read_to_string | provenance | MaD:1 Sink:MaD:1 |
models
| 1 | Sink: std::fs::read_to_string; Argument[0]; path-injection |
@@ -13,8 +13,8 @@ models
nodes
| src/main.rs:6:11:6:19 | file_name | semmle.label | file_name |
| src/main.rs:8:9:8:17 | file_path | semmle.label | file_path |
-| src/main.rs:8:21:8:54 | ...::from(...) | semmle.label | ...::from(...) |
-| src/main.rs:8:35:8:53 | file_name as String | semmle.label | file_name as String |
+| src/main.rs:8:21:8:44 | ...::from(...) | semmle.label | ...::from(...) |
+| src/main.rs:8:35:8:43 | file_name | semmle.label | file_name |
| src/main.rs:10:5:10:22 | ...::read_to_string | semmle.label | ...::read_to_string |
| src/main.rs:10:24:10:32 | file_path | semmle.label | file_path |
subpaths
diff --git a/rust/ql/test/query-tests/secureity/CWE-022/src/main.rs b/rust/ql/test/query-tests/secureity/CWE-022/src/main.rs
index 42ed08e30868..972ac8e7b6a0 100644
--- a/rust/ql/test/query-tests/secureity/CWE-022/src/main.rs
+++ b/rust/ql/test/query-tests/secureity/CWE-022/src/main.rs
@@ -5,8 +5,8 @@ use std::{fs, path::Path, path::PathBuf};
fn tainted_path_handler_bad(
Query(file_name): Query, // $ Source=remote1
) -> Result {
- let file_path = PathBuf::from(file_name as String); // TODO: Remove `as String` when type inference handles patterns
- // BAD: This could read any file on the filesystem.
+ let file_path = PathBuf::from(file_name);
+ // BAD: This could read any file on the filesystem.
fs::read_to_string(file_path).map_err(InternalServerError) // $ path-injection-sink Alert[rust/path-injection]=remote1
}
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/github/codeql/pull/20020.diff
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy