Merge pull request #20155 from paldepind/rust/type-inference-certain

Rust: Add predicate for certain type information
This commit is contained in:
Tom Hvitved
2025-08-06 10:55:34 +02:00
committed by GitHub
8 changed files with 279 additions and 91 deletions

View File

@@ -221,7 +221,13 @@ private module M2 = Make2<Input2>;
private import M2
module Consistency = M2::Consistency;
module Consistency {
import M2::Consistency
query predicate nonUniqueCertainType(AstNode n, TypePath path) {
strictcount(CertainTypeInference::inferCertainType(n, path)) > 1
}
}
/** Gets the type annotation that applies to `n`, if any. */
private TypeMention getTypeAnnotation(AstNode n) {
@@ -249,6 +255,134 @@ private Type inferAnnotatedType(AstNode n, TypePath path) {
result = getTypeAnnotation(n).resolveTypeAt(path)
}
/** Module for inferring certain type information. */
private module CertainTypeInference {
/** Holds if the type mention does not contain any inferred types `_`. */
predicate typeMentionIsComplete(TypeMention tm) {
not exists(InferTypeRepr t | t.getParentNode*() = tm)
}
/**
* Holds if `ce` is a call where we can infer the type with certainty and if
* `f` is the target of the call and `p` the path invoked by the call.
*
* Necessary conditions for this are:
* - We are certain of the call target (i.e., the call target can not depend on type information).
* - The declared type of the function does not contain any generics that we
* need to infer.
* - The call does not contain any arguments, as arguments in calls are coercion sites.
*
* The current requirements are made to allow for call to `new` functions such
* as `Vec<Foo>::new()` but not much more.
*/
predicate certainCallExprTarget(CallExpr ce, Function f, Path p) {
p = CallExprImpl::getFunctionPath(ce) and
f = resolvePath(p) and
// The function is not in a trait
not any(TraitItemNode t).getAnAssocItem() = f and
// The function is not in a trait implementation
not any(ImplItemNode impl | impl.(Impl).hasTrait()).getAnAssocItem() = f and
// The function does not have parameters.
not f.getParamList().hasSelfParam() and
f.getParamList().getNumberOfParams() = 0 and
// The function is not async.
not f.isAsync() and
// For now, exclude functions in macro expansions.
not ce.isInMacroExpansion() and
// The function has no type parameters.
not f.hasGenericParamList() and
// The function does not have `impl` types among its parameters (these are type parameters).
not any(ImplTraitTypeRepr itt | not itt.isInReturnPos()).getFunction() = f and
(
not exists(ImplItemNode impl | impl.getAnAssocItem() = f)
or
// If the function is in an impl then the impl block has no type
// parameters or all the type parameters are given explicitly.
exists(ImplItemNode impl | impl.getAnAssocItem() = f |
not impl.(Impl).hasGenericParamList() or
impl.(Impl).getGenericParamList().getNumberOfGenericParams() =
p.getQualifier().getSegment().getGenericArgList().getNumberOfGenericArgs()
)
)
}
private ImplItemNode getFunctionImpl(FunctionItemNode f) { result.getAnAssocItem() = f }
Type inferCertainCallExprType(CallExpr ce, TypePath path) {
exists(Function f, Type ty, TypePath prefix, Path p |
certainCallExprTarget(ce, f, p) and
ty = f.getRetType().getTypeRepr().(TypeMention).resolveTypeAt(prefix)
|
if ty.(TypeParamTypeParameter).getTypeParam() = getFunctionImpl(f).getTypeParam(_)
then
exists(TypePath pathToTp, TypePath suffix |
// For type parameters of the `impl` block we must resolve their
// instantiation from the path. For instance, for `impl<A> for Foo<A>`
// and the path `Foo<i64>::bar` we must resolve `A` to `i64`.
ty = getFunctionImpl(f).(Impl).getSelfTy().(TypeMention).resolveTypeAt(pathToTp) and
result = p.getQualifier().(TypeMention).resolveTypeAt(pathToTp.appendInverse(suffix)) and
path = prefix.append(suffix)
)
else (
result = ty and path = prefix
)
)
}
predicate certainTypeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) {
prefix1.isEmpty() and
prefix2.isEmpty() and
(
exists(Variable v | n1 = v.getAnAccess() |
n2 = v.getPat().getName() or n2 = v.getParameter().(SelfParam)
)
or
// A `let` statement with a type annotation is a coercion site and hence
// is not a certain type equality.
exists(LetStmt let | not let.hasTypeRepr() |
let.getPat() = n1 and
let.getInitializer() = n2
)
)
or
n1 =
any(IdentPat ip |
n2 = ip.getName() and
prefix1.isEmpty() and
if ip.isRef() then prefix2 = TypePath::singleton(TRefTypeParameter()) else prefix2.isEmpty()
)
}
pragma[nomagic]
private Type inferCertainTypeEquality(AstNode n, TypePath path) {
exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix |
result = inferCertainType(n2, prefix2.appendInverse(suffix)) and
path = prefix1.append(suffix)
|
certainTypeEquality(n, prefix1, n2, prefix2)
or
certainTypeEquality(n2, prefix2, n, prefix1)
)
}
/**
* Holds if `n` has complete and certain type information and if `n` has the
* resulting type at `path`.
*/
pragma[nomagic]
Type inferCertainType(AstNode n, TypePath path) {
exists(TypeMention tm |
tm = getTypeAnnotation(n) and
typeMentionIsComplete(tm) and
result = tm.resolveTypeAt(path)
)
or
result = inferCertainCallExprType(n, path)
or
result = inferCertainTypeEquality(n, path)
}
}
private Type inferLogicalOperationType(AstNode n, TypePath path) {
exists(Builtins::BuiltinType t, BinaryLogicalOperation be |
n = [be, be.getLhs(), be.getRhs()] and
@@ -288,15 +422,11 @@ private Struct getRangeType(RangeExpr re) {
* through the type equality.
*/
private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) {
CertainTypeInference::certainTypeEquality(n1, prefix1, n2, prefix2)
or
prefix1.isEmpty() and
prefix2.isEmpty() and
(
exists(Variable v | n1 = v.getAnAccess() |
n2 = v.getPat().getName()
or
n2 = v.getParameter().(SelfParam)
)
or
exists(LetStmt let |
let.getPat() = n1 and
let.getInitializer() = n2
@@ -339,13 +469,6 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat
n1 = n2.(MacroPat).getMacroCall().getMacroCallExpansion()
)
or
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()
@@ -408,6 +531,9 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat
pragma[nomagic]
private Type inferTypeEquality(AstNode n, TypePath path) {
// Don't propagate type information into a node for which we already have
// certain type information.
not exists(CertainTypeInference::inferCertainType(n, _)) and
exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix |
result = inferType(n2, prefix2.appendInverse(suffix)) and
path = prefix1.append(suffix)
@@ -818,6 +944,8 @@ private module CallExprBaseMatchingInput implements MatchingInputSig {
}
final class Access extends Call {
Access() { not CertainTypeInference::certainCallExprTarget(this, _, _) }
pragma[nomagic]
Type getTypeArgument(TypeArgumentPosition apos, TypePath path) {
exists(TypeMention arg | result = arg.resolveTypeAt(path) |
@@ -2152,6 +2280,8 @@ private module Cached {
cached
Type inferType(AstNode n, TypePath path) {
Stages::TypeInferenceStage::ref() and
result = CertainTypeInference::inferCertainType(n, path)
or
result = inferAnnotatedType(n, path)
or
result = inferLogicalOperationType(n, path)
@@ -2307,4 +2437,10 @@ private module Debug {
c = countTypePaths(n, path, t) and
c = max(countTypePaths(_, _, _))
}
Type debugInferCertainNonUniqueType(AstNode n, TypePath path) {
n = getRelevantLocatable() and
Consistency::nonUniqueCertainType(n, path) and
result = CertainTypeInference::inferCertainType(n, path)
}
}

View File

@@ -2,8 +2,10 @@
* Provides classes for recognizing type inference inconsistencies.
*/
private import rust
private import Type
private import TypeMention
private import TypeInference
private import TypeInference::Consistency as Consistency
import TypeInference::Consistency
@@ -27,4 +29,7 @@ int getTypeInferenceInconsistencyCounts(string type) {
or
type = "Ill-formed type mention" and
result = count(TypeMention tm | illFormedTypeMention(tm) | tm)
or
type = "Non-unique certain type information" and
result = count(AstNode n, TypePath path | nonUniqueCertainType(n, path) | n)
}

View File

@@ -0,0 +1,4 @@
nonUniqueCertainType
| web_frameworks.rs:139:30:139:39 | ...::get(...) | |
| web_frameworks.rs:140:34:140:43 | ...::get(...) | |
| web_frameworks.rs:141:30:141:39 | ...::get(...) | |

View File

@@ -93,10 +93,46 @@ fn implicit_dereference() {
let _y = x.is_positive(); // $ MISSING: target=is_positive type=_y:bool
}
mod implicit_deref_coercion_cycle {
use std::collections::HashMap;
#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)]
pub struct Key {}
// This example can trigger a cycle in type inference due to an implicit
// dereference if we are not careful and accurate enough.
//
// To explain how a cycle might happen, we let `[V]` denote the type of the
// type parameter `V` of `key_to_key` (i.e., the type of the values in the
// map) and `[key]` denote the type of `key`.
//
// 1. From the first two lines we infer `[V] = &Key` and `[key] = &Key`
// 2. At the 3. line we infer the type of `ref_key` to be `&[V]`.
// 3. At the 4. line we impose the equality `[key] = &[V]`, not accounting
// for the implicit deref caused by a coercion.
// 4. At the last line we infer `[key] = [V]`.
//
// Putting the above together we have `[V] = [key] = &[V]` which is a cycle.
// This means that `[key]` is both `&Key`, `&&Key`, `&&&Key`, and so on ad
// infinitum.
#[rustfmt::skip]
pub fn test() {
let mut key_to_key = HashMap::<&Key, &Key>::new(); // $ target=new
let mut key = &Key {}; // Initialize key2 to a reference
if let Some(ref_key) = key_to_key.get(key) { // $ target=get
// Below `ref_key` is implicitly dereferenced from `&&Key` to `&Key`
key = ref_key;
}
key_to_key.insert(key, key); // $ target=insert
}
}
pub fn test() {
explicit_monomorphic_dereference(); // $ target=explicit_monomorphic_dereference
explicit_polymorphic_dereference(); // $ target=explicit_polymorphic_dereference
explicit_ref_dereference(); // $ target=explicit_ref_dereference
explicit_box_dereference(); // $ target=explicit_box_dereference
implicit_dereference(); // $ target=implicit_dereference
implicit_deref_coercion_cycle::test(); // $ target=test
}

View File

@@ -2352,7 +2352,7 @@ mod loops {
#[rustfmt::skip]
let _ = while a < 10 // $ target=lt type=a:i64
{
a += 1; // $ type=a:i64 target=add_assign
a += 1; // $ type=a:i64 MISSING: target=add_assign
};
}
}

View File

@@ -365,6 +365,86 @@ inferType
| dereference.rs:92:37:92:41 | 34i64 | | {EXTERNAL LOCATION} | i64 |
| dereference.rs:93:14:93:14 | x | | dereference.rs:17:1:19:1 | MySmartPointer |
| dereference.rs:93:14:93:14 | x | T | {EXTERNAL LOCATION} | i64 |
| dereference.rs:121:17:121:26 | key_to_key | | {EXTERNAL LOCATION} | HashMap |
| dereference.rs:121:17:121:26 | key_to_key | K | file://:0:0:0:0 | & |
| dereference.rs:121:17:121:26 | key_to_key | K.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:121:17:121:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState |
| dereference.rs:121:17:121:26 | key_to_key | V | file://:0:0:0:0 | & |
| dereference.rs:121:17:121:26 | key_to_key | V.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:121:30:121:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap |
| dereference.rs:121:30:121:57 | ...::new(...) | K | file://:0:0:0:0 | & |
| dereference.rs:121:30:121:57 | ...::new(...) | K.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:121:30:121:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState |
| dereference.rs:121:30:121:57 | ...::new(...) | V | file://:0:0:0:0 | & |
| dereference.rs:121:30:121:57 | ...::new(...) | V.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:122:17:122:19 | key | | file://:0:0:0:0 | & |
| dereference.rs:122:17:122:19 | key | &T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:122:17:122:19 | key | &T | file://:0:0:0:0 | & |
| dereference.rs:122:17:122:19 | key | &T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:122:23:122:29 | &... | | file://:0:0:0:0 | & |
| dereference.rs:122:23:122:29 | &... | &T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:122:23:122:29 | &... | &T | file://:0:0:0:0 | & |
| dereference.rs:122:23:122:29 | &... | &T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:122:24:122:29 | Key {...} | | dereference.rs:99:5:100:21 | Key |
| dereference.rs:122:24:122:29 | Key {...} | | file://:0:0:0:0 | & |
| dereference.rs:122:24:122:29 | Key {...} | &T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:16:123:28 | Some(...) | | {EXTERNAL LOCATION} | Option |
| dereference.rs:123:16:123:28 | Some(...) | T | file://:0:0:0:0 | & |
| dereference.rs:123:16:123:28 | Some(...) | T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:16:123:28 | Some(...) | T.&T | file://:0:0:0:0 | & |
| dereference.rs:123:16:123:28 | Some(...) | T.&T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:21:123:27 | ref_key | | file://:0:0:0:0 | & |
| dereference.rs:123:21:123:27 | ref_key | &T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:21:123:27 | ref_key | &T | file://:0:0:0:0 | & |
| dereference.rs:123:21:123:27 | ref_key | &T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:32:123:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap |
| dereference.rs:123:32:123:41 | key_to_key | K | file://:0:0:0:0 | & |
| dereference.rs:123:32:123:41 | key_to_key | K.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:32:123:41 | key_to_key | S | {EXTERNAL LOCATION} | RandomState |
| dereference.rs:123:32:123:41 | key_to_key | V | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:32:123:41 | key_to_key | V | file://:0:0:0:0 | & |
| dereference.rs:123:32:123:41 | key_to_key | V.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:32:123:50 | key_to_key.get(...) | | {EXTERNAL LOCATION} | Option |
| dereference.rs:123:32:123:50 | key_to_key.get(...) | T | file://:0:0:0:0 | & |
| dereference.rs:123:32:123:50 | key_to_key.get(...) | T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:32:123:50 | key_to_key.get(...) | T.&T | file://:0:0:0:0 | & |
| dereference.rs:123:32:123:50 | key_to_key.get(...) | T.&T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:47:123:49 | key | | file://:0:0:0:0 | & |
| dereference.rs:123:47:123:49 | key | &T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:123:47:123:49 | key | &T | file://:0:0:0:0 | & |
| dereference.rs:123:47:123:49 | key | &T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:125:13:125:15 | key | | file://:0:0:0:0 | & |
| dereference.rs:125:13:125:15 | key | &T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:125:13:125:15 | key | &T | file://:0:0:0:0 | & |
| dereference.rs:125:13:125:15 | key | &T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:125:13:125:25 | ... = ... | | file://:0:0:0:0 | () |
| dereference.rs:125:19:125:25 | ref_key | | file://:0:0:0:0 | & |
| dereference.rs:125:19:125:25 | ref_key | &T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:125:19:125:25 | ref_key | &T | file://:0:0:0:0 | & |
| dereference.rs:125:19:125:25 | ref_key | &T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:9:127:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap |
| dereference.rs:127:9:127:18 | key_to_key | K | file://:0:0:0:0 | & |
| dereference.rs:127:9:127:18 | key_to_key | K.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:9:127:18 | key_to_key | K.&T | file://:0:0:0:0 | & |
| dereference.rs:127:9:127:18 | key_to_key | K.&T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:9:127:18 | key_to_key | S | {EXTERNAL LOCATION} | RandomState |
| dereference.rs:127:9:127:18 | key_to_key | V | file://:0:0:0:0 | & |
| dereference.rs:127:9:127:18 | key_to_key | V.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:9:127:18 | key_to_key | V.&T | file://:0:0:0:0 | & |
| dereference.rs:127:9:127:18 | key_to_key | V.&T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:9:127:35 | key_to_key.insert(...) | | {EXTERNAL LOCATION} | Option |
| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T | file://:0:0:0:0 | & |
| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T.&T | file://:0:0:0:0 | & |
| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T.&T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:27:127:29 | key | | file://:0:0:0:0 | & |
| dereference.rs:127:27:127:29 | key | &T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:27:127:29 | key | &T | file://:0:0:0:0 | & |
| dereference.rs:127:27:127:29 | key | &T.&T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:32:127:34 | key | | file://:0:0:0:0 | & |
| dereference.rs:127:32:127:34 | key | &T | dereference.rs:99:5:100:21 | Key |
| dereference.rs:127:32:127:34 | key | &T | file://:0:0:0:0 | & |
| dereference.rs:127:32:127:34 | key | &T.&T | dereference.rs:99:5:100:21 | Key |
| dyn_type.rs:7:10:7:14 | SelfParam | | file://:0:0:0:0 | & |
| dyn_type.rs:7:10:7:14 | SelfParam | &T | dyn_type.rs:5:1:8:1 | Self [trait MyTrait1] |
| dyn_type.rs:12:12:12:16 | SelfParam | | file://:0:0:0:0 | & |
@@ -420,8 +500,6 @@ inferType
| dyn_type.rs:60:78:62:1 | { ... } | | {EXTERNAL LOCATION} | Box |
| dyn_type.rs:60:78:62:1 | { ... } | A | {EXTERNAL LOCATION} | Global |
| dyn_type.rs:60:78:62:1 | { ... } | T | dyn_type.rs:10:1:13:1 | dyn GenericGet |
| dyn_type.rs:60:78:62:1 | { ... } | T | dyn_type.rs:33:1:36:1 | GenStruct |
| dyn_type.rs:60:78:62:1 | { ... } | T.A | dyn_type.rs:60:18:60:43 | A |
| dyn_type.rs:60:78:62:1 | { ... } | T.dyn(A) | dyn_type.rs:60:18:60:43 | A |
| dyn_type.rs:61:5:61:36 | ...::new(...) | | {EXTERNAL LOCATION} | Box |
| dyn_type.rs:61:5:61:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global |
@@ -2596,11 +2674,7 @@ inferType
| main.rs:1371:15:1371:19 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:1371:15:1371:19 | SelfParam | &T | main.rs:1368:5:1368:13 | S |
| main.rs:1371:31:1373:9 | { ... } | | file://:0:0:0:0 | & |
| main.rs:1371:31:1373:9 | { ... } | &T | file://:0:0:0:0 | & |
| main.rs:1371:31:1373:9 | { ... } | &T | main.rs:1368:5:1368:13 | S |
| main.rs:1371:31:1373:9 | { ... } | &T.&T | file://:0:0:0:0 | & |
| main.rs:1371:31:1373:9 | { ... } | &T.&T.&T | file://:0:0:0:0 | & |
| main.rs:1371:31:1373:9 | { ... } | &T.&T.&T.&T | main.rs:1368:5:1368:13 | S |
| main.rs:1372:13:1372:19 | &... | | file://:0:0:0:0 | & |
| main.rs:1372:13:1372:19 | &... | &T | file://:0:0:0:0 | & |
| main.rs:1372:13:1372:19 | &... | &T | main.rs:1368:5:1368:13 | S |
@@ -2620,11 +2694,7 @@ inferType
| main.rs:1375:15:1375:25 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:1375:15:1375:25 | SelfParam | &T | main.rs:1368:5:1368:13 | S |
| main.rs:1375:37:1377:9 | { ... } | | file://:0:0:0:0 | & |
| main.rs:1375:37:1377:9 | { ... } | &T | file://:0:0:0:0 | & |
| main.rs:1375:37:1377:9 | { ... } | &T | main.rs:1368:5:1368:13 | S |
| main.rs:1375:37:1377:9 | { ... } | &T.&T | file://:0:0:0:0 | & |
| main.rs:1375:37:1377:9 | { ... } | &T.&T.&T | file://:0:0:0:0 | & |
| main.rs:1375:37:1377:9 | { ... } | &T.&T.&T.&T | main.rs:1368:5:1368:13 | S |
| main.rs:1376:13:1376:19 | &... | | file://:0:0:0:0 | & |
| main.rs:1376:13:1376:19 | &... | &T | file://:0:0:0:0 | & |
| main.rs:1376:13:1376:19 | &... | &T | main.rs:1368:5:1368:13 | S |
@@ -2650,11 +2720,7 @@ inferType
| main.rs:1383:15:1383:15 | x | | file://:0:0:0:0 | & |
| main.rs:1383:15:1383:15 | x | &T | main.rs:1368:5:1368:13 | S |
| main.rs:1383:34:1385:9 | { ... } | | file://:0:0:0:0 | & |
| main.rs:1383:34:1385:9 | { ... } | &T | file://:0:0:0:0 | & |
| main.rs:1383:34:1385:9 | { ... } | &T | main.rs:1368:5:1368:13 | S |
| main.rs:1383:34:1385:9 | { ... } | &T.&T | file://:0:0:0:0 | & |
| main.rs:1383:34:1385:9 | { ... } | &T.&T.&T | file://:0:0:0:0 | & |
| main.rs:1383:34:1385:9 | { ... } | &T.&T.&T.&T | main.rs:1368:5:1368:13 | S |
| main.rs:1384:13:1384:16 | &... | | file://:0:0:0:0 | & |
| main.rs:1384:13:1384:16 | &... | &T | file://:0:0:0:0 | & |
| main.rs:1384:13:1384:16 | &... | &T | main.rs:1368:5:1368:13 | S |
@@ -3623,9 +3689,7 @@ inferType
| main.rs:1877:18:1877:21 | SelfParam | | main.rs:1874:5:1874:14 | S1 |
| main.rs:1880:25:1882:5 | { ... } | | main.rs:1874:5:1874:14 | S1 |
| main.rs:1881:9:1881:10 | S1 | | main.rs:1874:5:1874:14 | S1 |
| main.rs:1884:41:1886:5 | { ... } | | {EXTERNAL LOCATION} | trait Future |
| main.rs:1884:41:1886:5 | { ... } | | main.rs:1884:16:1884:39 | ImplTraitTypeRepr |
| main.rs:1884:41:1886:5 | { ... } | Output | main.rs:1874:5:1874:14 | S1 |
| main.rs:1885:9:1885:20 | { ... } | | {EXTERNAL LOCATION} | trait Future |
| main.rs:1885:9:1885:20 | { ... } | | main.rs:1884:16:1884:39 | ImplTraitTypeRepr |
| main.rs:1885:9:1885:20 | { ... } | Output | main.rs:1874:5:1874:14 | S1 |
@@ -3640,7 +3704,6 @@ inferType
| main.rs:1897:13:1897:38 | ...::Ready(...) | | {EXTERNAL LOCATION} | Poll |
| main.rs:1897:13:1897:38 | ...::Ready(...) | T | main.rs:1874:5:1874:14 | S1 |
| main.rs:1897:36:1897:37 | S1 | | main.rs:1874:5:1874:14 | S1 |
| main.rs:1901:41:1903:5 | { ... } | | main.rs:1888:5:1888:14 | S2 |
| main.rs:1901:41:1903:5 | { ... } | | main.rs:1901:16:1901:39 | ImplTraitTypeRepr |
| main.rs:1902:9:1902:10 | S2 | | main.rs:1888:5:1888:14 | S2 |
| main.rs:1902:9:1902:10 | S2 | | main.rs:1901:16:1901:39 | ImplTraitTypeRepr |
@@ -3669,7 +3732,6 @@ inferType
| main.rs:1930:15:1930:19 | SelfParam | &T | main.rs:1916:5:1917:14 | S1 |
| main.rs:1934:15:1934:19 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:1934:15:1934:19 | SelfParam | &T | main.rs:1916:5:1917:14 | S1 |
| main.rs:1937:37:1939:5 | { ... } | | main.rs:1916:5:1917:14 | S1 |
| main.rs:1937:37:1939:5 | { ... } | | main.rs:1937:16:1937:35 | ImplTraitTypeRepr |
| main.rs:1938:9:1938:10 | S1 | | main.rs:1916:5:1917:14 | S1 |
| main.rs:1938:9:1938:10 | S1 | | main.rs:1937:16:1937:35 | ImplTraitTypeRepr |
@@ -3693,7 +3755,6 @@ inferType
| main.rs:1953:25:1953:28 | self | &T | main.rs:1919:5:1919:22 | S3 |
| main.rs:1953:25:1953:28 | self | &T.T3 | main.rs:1951:10:1951:17 | T |
| main.rs:1954:13:1954:21 | t.clone() | | main.rs:1951:10:1951:17 | T |
| main.rs:1958:45:1960:5 | { ... } | | main.rs:1916:5:1917:14 | S1 |
| main.rs:1958:45:1960:5 | { ... } | | main.rs:1958:28:1958:43 | ImplTraitTypeRepr |
| main.rs:1959:9:1959:10 | S1 | | main.rs:1916:5:1917:14 | S1 |
| main.rs:1959:9:1959:10 | S1 | | main.rs:1958:28:1958:43 | ImplTraitTypeRepr |
@@ -3702,9 +3763,7 @@ inferType
| main.rs:1963:9:1963:9 | t | | main.rs:1962:26:1962:38 | B |
| main.rs:1963:9:1963:17 | t.get_a() | | main.rs:1962:23:1962:23 | A |
| main.rs:1966:34:1966:34 | x | | main.rs:1966:24:1966:31 | T |
| main.rs:1966:59:1968:5 | { ... } | | main.rs:1919:5:1919:22 | S3 |
| main.rs:1966:59:1968:5 | { ... } | | main.rs:1966:43:1966:57 | ImplTraitTypeRepr |
| main.rs:1966:59:1968:5 | { ... } | T3 | main.rs:1966:24:1966:31 | T |
| main.rs:1966:59:1968:5 | { ... } | impl(T) | main.rs:1966:24:1966:31 | T |
| main.rs:1967:9:1967:13 | S3(...) | | main.rs:1919:5:1919:22 | S3 |
| main.rs:1967:9:1967:13 | S3(...) | | main.rs:1966:43:1966:57 | ImplTraitTypeRepr |
@@ -3713,9 +3772,7 @@ inferType
| main.rs:1967:12:1967:12 | x | | main.rs:1966:24:1966:31 | T |
| main.rs:1970:34:1970:34 | x | | main.rs:1970:24:1970:31 | T |
| main.rs:1970:67:1972:5 | { ... } | | {EXTERNAL LOCATION} | Option |
| main.rs:1970:67:1972:5 | { ... } | T | main.rs:1919:5:1919:22 | S3 |
| main.rs:1970:67:1972:5 | { ... } | T | main.rs:1970:50:1970:64 | ImplTraitTypeRepr |
| main.rs:1970:67:1972:5 | { ... } | T.T3 | main.rs:1970:24:1970:31 | T |
| main.rs:1970:67:1972:5 | { ... } | T.impl(T) | main.rs:1970:24:1970:31 | T |
| main.rs:1971:9:1971:19 | Some(...) | | {EXTERNAL LOCATION} | Option |
| main.rs:1971:9:1971:19 | Some(...) | T | main.rs:1919:5:1919:22 | S3 |
@@ -3729,13 +3786,9 @@ inferType
| main.rs:1971:17:1971:17 | x | | main.rs:1970:24:1970:31 | T |
| main.rs:1974:34:1974:34 | x | | main.rs:1974:24:1974:31 | T |
| main.rs:1974:78:1976:5 | { ... } | | file://:0:0:0:0 | (T_2) |
| main.rs:1974:78:1976:5 | { ... } | 0(2) | main.rs:1919:5:1919:22 | S3 |
| main.rs:1974:78:1976:5 | { ... } | 0(2) | main.rs:1974:44:1974:58 | ImplTraitTypeRepr |
| main.rs:1974:78:1976:5 | { ... } | 0(2).T3 | main.rs:1974:24:1974:31 | T |
| main.rs:1974:78:1976:5 | { ... } | 0(2).impl(T) | main.rs:1974:24:1974:31 | T |
| main.rs:1974:78:1976:5 | { ... } | 1(2) | main.rs:1919:5:1919:22 | S3 |
| main.rs:1974:78:1976:5 | { ... } | 1(2) | main.rs:1974:61:1974:75 | ImplTraitTypeRepr |
| main.rs:1974:78:1976:5 | { ... } | 1(2).T3 | main.rs:1974:24:1974:31 | T |
| main.rs:1974:78:1976:5 | { ... } | 1(2).impl(T) | main.rs:1974:24:1974:31 | T |
| main.rs:1975:9:1975:30 | TupleExpr | | file://:0:0:0:0 | (T_2) |
| main.rs:1975:9:1975:30 | TupleExpr | 0(2) | main.rs:1919:5:1919:22 | S3 |
@@ -3840,7 +3893,6 @@ inferType
| main.rs:2030:14:2030:29 | ...[index] | | main.rs:2025:10:2025:10 | T |
| main.rs:2030:24:2030:28 | index | | {EXTERNAL LOCATION} | usize |
| main.rs:2034:22:2034:26 | slice | | file://:0:0:0:0 | & |
| main.rs:2034:22:2034:26 | slice | | file://:0:0:0:0 | [] |
| main.rs:2034:22:2034:26 | slice | &T | file://:0:0:0:0 | [] |
| main.rs:2034:22:2034:26 | slice | &T.[T] | main.rs:2001:5:2002:13 | S |
| main.rs:2041:13:2041:13 | x | | main.rs:2001:5:2002:13 | S |
@@ -3865,20 +3917,14 @@ inferType
| main.rs:2047:13:2047:13 | 0 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2047:13:2047:13 | 0 | | {EXTERNAL LOCATION} | usize |
| main.rs:2049:13:2049:14 | xs | | file://:0:0:0:0 | [] |
| main.rs:2049:13:2049:14 | xs | | file://:0:0:0:0 | [] |
| main.rs:2049:13:2049:14 | xs | [T;...] | main.rs:2001:5:2002:13 | S |
| main.rs:2049:13:2049:14 | xs | [T] | main.rs:2001:5:2002:13 | S |
| main.rs:2049:21:2049:21 | 1 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2049:26:2049:28 | [...] | | file://:0:0:0:0 | [] |
| main.rs:2049:26:2049:28 | [...] | | file://:0:0:0:0 | [] |
| main.rs:2049:26:2049:28 | [...] | [T;...] | main.rs:2001:5:2002:13 | S |
| main.rs:2049:26:2049:28 | [...] | [T] | main.rs:2001:5:2002:13 | S |
| main.rs:2049:27:2049:27 | S | | main.rs:2001:5:2002:13 | S |
| main.rs:2050:13:2050:13 | x | | main.rs:2001:5:2002:13 | S |
| main.rs:2050:17:2050:18 | xs | | file://:0:0:0:0 | [] |
| main.rs:2050:17:2050:18 | xs | | file://:0:0:0:0 | [] |
| main.rs:2050:17:2050:18 | xs | [T;...] | main.rs:2001:5:2002:13 | S |
| main.rs:2050:17:2050:18 | xs | [T] | main.rs:2001:5:2002:13 | S |
| main.rs:2050:17:2050:21 | xs[0] | | main.rs:2001:5:2002:13 | S |
| main.rs:2050:17:2050:27 | ... .foo() | | main.rs:2001:5:2002:13 | S |
| main.rs:2050:20:2050:20 | 0 | | {EXTERNAL LOCATION} | i32 |
@@ -3888,9 +3934,7 @@ inferType
| main.rs:2052:23:2052:25 | &xs | &T.[T;...] | main.rs:2001:5:2002:13 | S |
| main.rs:2052:23:2052:25 | &xs | &T.[T] | main.rs:2001:5:2002:13 | S |
| main.rs:2052:24:2052:25 | xs | | file://:0:0:0:0 | [] |
| main.rs:2052:24:2052:25 | xs | | file://:0:0:0:0 | [] |
| main.rs:2052:24:2052:25 | xs | [T;...] | main.rs:2001:5:2002:13 | S |
| main.rs:2052:24:2052:25 | xs | [T] | main.rs:2001:5:2002:13 | S |
| main.rs:2058:13:2058:13 | x | | {EXTERNAL LOCATION} | String |
| main.rs:2058:17:2058:46 | MacroExpr | | {EXTERNAL LOCATION} | String |
| main.rs:2058:25:2058:35 | "Hello, {}" | | file://:0:0:0:0 | & |
@@ -3917,7 +3961,6 @@ inferType
| main.rs:2084:14:2084:18 | value | &T | {EXTERNAL LOCATION} | i64 |
| main.rs:2092:19:2092:22 | SelfParam | | {EXTERNAL LOCATION} | i64 |
| main.rs:2092:25:2092:29 | value | | {EXTERNAL LOCATION} | bool |
| main.rs:2092:46:2098:9 | { ... } | | {EXTERNAL LOCATION} | i32 |
| main.rs:2092:46:2098:9 | { ... } | | {EXTERNAL LOCATION} | i64 |
| main.rs:2093:13:2097:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 |
| main.rs:2093:13:2097:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 |
@@ -3933,7 +3976,6 @@ inferType
| main.rs:2107:19:2107:22 | SelfParam | | main.rs:2101:5:2101:19 | S |
| main.rs:2107:19:2107:22 | SelfParam | T | main.rs:2103:10:2103:17 | T |
| main.rs:2107:25:2107:29 | other | | main.rs:2101:5:2101:19 | S |
| main.rs:2107:25:2107:29 | other | T | main.rs:2063:5:2068:5 | Self [trait MyAdd] |
| main.rs:2107:25:2107:29 | other | T | main.rs:2103:10:2103:17 | T |
| main.rs:2107:54:2109:9 | { ... } | | main.rs:2101:5:2101:19 | S |
| main.rs:2107:54:2109:9 | { ... } | T | main.rs:2064:9:2064:20 | Output |
@@ -3951,7 +3993,6 @@ inferType
| main.rs:2108:31:2108:37 | other.0 | | main.rs:2103:10:2103:17 | T |
| main.rs:2116:19:2116:22 | SelfParam | | main.rs:2101:5:2101:19 | S |
| main.rs:2116:19:2116:22 | SelfParam | T | main.rs:2112:10:2112:17 | T |
| main.rs:2116:25:2116:29 | other | | main.rs:2063:5:2068:5 | Self [trait MyAdd] |
| main.rs:2116:25:2116:29 | other | | main.rs:2112:10:2112:17 | T |
| main.rs:2116:51:2118:9 | { ... } | | main.rs:2101:5:2101:19 | S |
| main.rs:2116:51:2118:9 | { ... } | T | main.rs:2064:9:2064:20 | Output |
@@ -3981,7 +4022,6 @@ inferType
| main.rs:2140:40:2142:9 | { ... } | | {EXTERNAL LOCATION} | i64 |
| main.rs:2141:13:2141:17 | value | | {EXTERNAL LOCATION} | i64 |
| main.rs:2147:20:2147:24 | value | | {EXTERNAL LOCATION} | bool |
| main.rs:2147:41:2153:9 | { ... } | | {EXTERNAL LOCATION} | i32 |
| main.rs:2147:41:2153:9 | { ... } | | {EXTERNAL LOCATION} | i64 |
| main.rs:2148:13:2152:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 |
| main.rs:2148:13:2152:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 |
@@ -4022,28 +4062,23 @@ inferType
| main.rs:2195:13:2195:17 | ... + ... | | {EXTERNAL LOCATION} | i64 |
| main.rs:2195:17:2195:17 | 1 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2201:15:2201:15 | x | | {EXTERNAL LOCATION} | bool |
| main.rs:2201:31:2203:9 | { ... } | | {EXTERNAL LOCATION} | i32 |
| main.rs:2201:31:2203:9 | { ... } | | {EXTERNAL LOCATION} | i64 |
| main.rs:2202:13:2202:13 | 0 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2202:13:2202:13 | 0 | | {EXTERNAL LOCATION} | i64 |
| main.rs:2206:15:2206:15 | x | | {EXTERNAL LOCATION} | bool |
| main.rs:2206:32:2208:9 | { ... } | | {EXTERNAL LOCATION} | bool |
| main.rs:2207:13:2207:13 | x | | {EXTERNAL LOCATION} | bool |
| main.rs:2212:13:2212:13 | x | | {EXTERNAL LOCATION} | i32 |
| main.rs:2212:13:2212:13 | x | | {EXTERNAL LOCATION} | i64 |
| main.rs:2212:22:2212:23 | 73 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2212:22:2212:23 | 73 | | {EXTERNAL LOCATION} | i64 |
| main.rs:2213:9:2213:9 | x | | {EXTERNAL LOCATION} | i32 |
| main.rs:2213:9:2213:9 | x | | {EXTERNAL LOCATION} | i64 |
| main.rs:2213:9:2213:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 |
| main.rs:2213:18:2213:21 | 5i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:2214:9:2214:9 | x | | {EXTERNAL LOCATION} | i32 |
| main.rs:2214:9:2214:9 | x | | {EXTERNAL LOCATION} | i64 |
| main.rs:2214:9:2214:23 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 |
| main.rs:2214:18:2214:22 | &5i64 | | file://:0:0:0:0 | & |
| main.rs:2214:18:2214:22 | &5i64 | &T | {EXTERNAL LOCATION} | i64 |
| main.rs:2214:19:2214:22 | 5i64 | | {EXTERNAL LOCATION} | i64 |
| main.rs:2215:9:2215:9 | x | | {EXTERNAL LOCATION} | i32 |
| main.rs:2215:9:2215:9 | x | | {EXTERNAL LOCATION} | i64 |
| main.rs:2215:9:2215:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 |
| main.rs:2215:18:2215:21 | true | | {EXTERNAL LOCATION} | bool |
@@ -4103,7 +4138,6 @@ inferType
| main.rs:2244:13:2244:25 | MyCallable {...} | | main.rs:2240:5:2240:24 | MyCallable |
| main.rs:2247:17:2247:21 | SelfParam | | file://:0:0:0:0 | & |
| main.rs:2247:17:2247:21 | SelfParam | &T | main.rs:2240:5:2240:24 | MyCallable |
| main.rs:2247:31:2249:9 | { ... } | | {EXTERNAL LOCATION} | i32 |
| main.rs:2247:31:2249:9 | { ... } | | {EXTERNAL LOCATION} | i64 |
| main.rs:2248:13:2248:13 | 1 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2248:13:2248:13 | 1 | | {EXTERNAL LOCATION} | i64 |
@@ -4158,7 +4192,6 @@ inferType
| main.rs:2263:18:2263:22 | vals2 | | file://:0:0:0:0 | [] |
| main.rs:2263:18:2263:22 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 |
| main.rs:2265:13:2265:17 | vals3 | | file://:0:0:0:0 | [] |
| main.rs:2265:13:2265:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | i32 |
| main.rs:2265:13:2265:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 |
| main.rs:2265:26:2265:26 | 3 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2265:31:2265:39 | [...] | | file://:0:0:0:0 | [] |
@@ -4170,13 +4203,10 @@ inferType
| main.rs:2265:35:2265:35 | 2 | | {EXTERNAL LOCATION} | u32 |
| main.rs:2265:38:2265:38 | 3 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2265:38:2265:38 | 3 | | {EXTERNAL LOCATION} | u32 |
| main.rs:2266:13:2266:13 | u | | {EXTERNAL LOCATION} | i32 |
| main.rs:2266:13:2266:13 | u | | {EXTERNAL LOCATION} | u32 |
| main.rs:2266:18:2266:22 | vals3 | | file://:0:0:0:0 | [] |
| main.rs:2266:18:2266:22 | vals3 | [T;...] | {EXTERNAL LOCATION} | i32 |
| main.rs:2266:18:2266:22 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 |
| main.rs:2268:13:2268:17 | vals4 | | file://:0:0:0:0 | [] |
| main.rs:2268:13:2268:17 | vals4 | [T;...] | {EXTERNAL LOCATION} | i32 |
| main.rs:2268:13:2268:17 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 |
| main.rs:2268:26:2268:26 | 3 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2268:31:2268:36 | [1; 3] | | file://:0:0:0:0 | [] |
@@ -4185,10 +4215,8 @@ inferType
| main.rs:2268:32:2268:32 | 1 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2268:32:2268:32 | 1 | | {EXTERNAL LOCATION} | u64 |
| main.rs:2268:35:2268:35 | 3 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2269:13:2269:13 | u | | {EXTERNAL LOCATION} | i32 |
| main.rs:2269:13:2269:13 | u | | {EXTERNAL LOCATION} | u64 |
| main.rs:2269:18:2269:22 | vals4 | | file://:0:0:0:0 | [] |
| main.rs:2269:18:2269:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | i32 |
| main.rs:2269:18:2269:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 |
| main.rs:2271:17:2271:24 | strings1 | | file://:0:0:0:0 | [] |
| main.rs:2271:17:2271:24 | strings1 | [T;...] | file://:0:0:0:0 | & |
@@ -4566,16 +4594,13 @@ inferType
| main.rs:2347:30:2347:33 | map1 | V.A | {EXTERNAL LOCATION} | Global |
| main.rs:2347:30:2347:33 | map1 | V.T | file://:0:0:0:0 | & |
| main.rs:2347:30:2347:33 | map1 | V.T.&T | {EXTERNAL LOCATION} | str |
| main.rs:2351:17:2351:17 | a | | {EXTERNAL LOCATION} | i32 |
| main.rs:2351:17:2351:17 | a | | {EXTERNAL LOCATION} | i64 |
| main.rs:2351:26:2351:26 | 0 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2351:26:2351:26 | 0 | | {EXTERNAL LOCATION} | i64 |
| main.rs:2353:23:2353:23 | a | | {EXTERNAL LOCATION} | i32 |
| main.rs:2353:23:2353:23 | a | | {EXTERNAL LOCATION} | i64 |
| main.rs:2353:23:2353:28 | ... < ... | | {EXTERNAL LOCATION} | bool |
| main.rs:2353:27:2353:28 | 10 | | {EXTERNAL LOCATION} | i32 |
| main.rs:2353:27:2353:28 | 10 | | {EXTERNAL LOCATION} | i64 |
| main.rs:2355:13:2355:13 | a | | {EXTERNAL LOCATION} | i32 |
| main.rs:2355:13:2355:13 | a | | {EXTERNAL LOCATION} | i64 |
| main.rs:2355:13:2355:18 | ... += ... | | file://:0:0:0:0 | () |
| main.rs:2355:18:2355:18 | 1 | | {EXTERNAL LOCATION} | i32 |
@@ -5826,8 +5851,6 @@ inferType
| pattern_matching.rs:504:65:504:71 | paren_y | | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:510:9:510:13 | slice | | file://:0:0:0:0 | & |
| pattern_matching.rs:510:9:510:13 | slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:510:9:510:13 | slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:510:9:510:13 | slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:510:9:510:13 | slice | &T.[T] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:510:25:510:40 | &... | | file://:0:0:0:0 | & |
| pattern_matching.rs:510:25:510:40 | &... | &T | file://:0:0:0:0 | [] |
@@ -5845,23 +5868,15 @@ inferType
| pattern_matching.rs:510:39:510:39 | 5 | | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:513:11:513:15 | slice | | file://:0:0:0:0 | & |
| pattern_matching.rs:513:11:513:15 | slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:513:11:513:15 | slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:513:11:513:15 | slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:513:11:513:15 | slice | &T.[T] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:514:9:514:10 | SlicePat | | file://:0:0:0:0 | & |
| pattern_matching.rs:514:9:514:10 | SlicePat | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:514:9:514:10 | SlicePat | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:514:9:514:10 | SlicePat | &T.[T;...] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:514:9:514:10 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:515:17:515:27 | empty_slice | | file://:0:0:0:0 | & |
| pattern_matching.rs:515:17:515:27 | empty_slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:515:17:515:27 | empty_slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:515:17:515:27 | empty_slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:515:17:515:27 | empty_slice | &T.[T] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:515:31:515:35 | slice | | file://:0:0:0:0 | & |
| pattern_matching.rs:515:31:515:35 | slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:515:31:515:35 | slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:515:31:515:35 | slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:515:31:515:35 | slice | &T.[T] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:516:22:516:40 | "Empty slice: {:?}\\n" | | file://:0:0:0:0 | & |
| pattern_matching.rs:516:22:516:40 | "Empty slice: {:?}\\n" | &T | {EXTERNAL LOCATION} | str |
@@ -5869,13 +5884,9 @@ inferType
| pattern_matching.rs:516:22:516:53 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
| pattern_matching.rs:516:43:516:53 | empty_slice | | file://:0:0:0:0 | & |
| pattern_matching.rs:516:43:516:53 | empty_slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:516:43:516:53 | empty_slice | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:516:43:516:53 | empty_slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:516:43:516:53 | empty_slice | &T.[T] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:518:9:518:11 | SlicePat | | file://:0:0:0:0 | & |
| pattern_matching.rs:518:9:518:11 | SlicePat | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:518:9:518:11 | SlicePat | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:518:9:518:11 | SlicePat | &T.[T;...] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:518:9:518:11 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:520:22:520:41 | "Single element: {}\\n" | | file://:0:0:0:0 | & |
| pattern_matching.rs:520:22:520:41 | "Single element: {}\\n" | &T | {EXTERNAL LOCATION} | str |
@@ -5883,8 +5894,6 @@ inferType
| pattern_matching.rs:520:22:520:54 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
| pattern_matching.rs:522:9:522:23 | SlicePat | | file://:0:0:0:0 | & |
| pattern_matching.rs:522:9:522:23 | SlicePat | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:522:9:522:23 | SlicePat | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:522:9:522:23 | SlicePat | &T.[T;...] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:522:9:522:23 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:525:22:525:43 | "Two elements: {}, {}\\n" | | file://:0:0:0:0 | & |
| pattern_matching.rs:525:22:525:43 | "Two elements: {}, {}\\n" | &T | {EXTERNAL LOCATION} | str |
@@ -5892,8 +5901,6 @@ inferType
| pattern_matching.rs:525:22:525:70 | MacroExpr | | {EXTERNAL LOCATION} | Arguments |
| pattern_matching.rs:527:9:527:34 | SlicePat | | file://:0:0:0:0 | & |
| pattern_matching.rs:527:9:527:34 | SlicePat | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:527:9:527:34 | SlicePat | &T | file://:0:0:0:0 | [] |
| pattern_matching.rs:527:9:527:34 | SlicePat | &T.[T;...] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:527:9:527:34 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 |
| pattern_matching.rs:532:17:532:53 | "First: {}, last: {}, middle l... | | file://:0:0:0:0 | & |
| pattern_matching.rs:532:17:532:53 | "First: {}, last: {}, middle l... | &T | {EXTERNAL LOCATION} | str |

View File

@@ -0,0 +1,3 @@
nonUniqueCertainType
| sqlx.rs:158:13:158:81 | { ... } | E |
| sqlx.rs:160:17:160:86 | { ... } | E |

View File

@@ -1,3 +0,0 @@
multipleCallTargets
| test.rs:82:26:82:44 | harmless.as_bytes() |
| test.rs:83:26:83:44 | password.as_bytes() |