Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
c94ba638
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c94ba638
编写于
5月 11, 2019
作者:
V
varkor
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Rename `OpportunisticTypeResolver` to `OpportunisticVarResolver`
上级
55dcc20f
变更
42
隐藏空白更改
内联
并排
Showing
42 changed file
with
111 addition
and
113 deletion
+111
-113
src/librustc/infer/error_reporting/mod.rs
src/librustc/infer/error_reporting/mod.rs
+3
-3
src/librustc/infer/error_reporting/need_type_info.rs
src/librustc/infer/error_reporting/need_type_info.rs
+3
-3
src/librustc/infer/error_reporting/nice_region_error/placeholder_error.rs
...er/error_reporting/nice_region_error/placeholder_error.rs
+2
-2
src/librustc/infer/fudge.rs
src/librustc/infer/fudge.rs
+1
-1
src/librustc/infer/mod.rs
src/librustc/infer/mod.rs
+10
-10
src/librustc/infer/opaque_types/mod.rs
src/librustc/infer/opaque_types/mod.rs
+1
-3
src/librustc/infer/outlives/env.rs
src/librustc/infer/outlives/env.rs
+1
-1
src/librustc/infer/outlives/obligations.rs
src/librustc/infer/outlives/obligations.rs
+2
-2
src/librustc/infer/resolve.rs
src/librustc/infer/resolve.rs
+7
-7
src/librustc/middle/mem_categorization.rs
src/librustc/middle/mem_categorization.rs
+4
-4
src/librustc/traits/auto_trait.rs
src/librustc/traits/auto_trait.rs
+3
-3
src/librustc/traits/chalk_fulfill.rs
src/librustc/traits/chalk_fulfill.rs
+1
-1
src/librustc/traits/codegen/mod.rs
src/librustc/traits/codegen/mod.rs
+1
-1
src/librustc/traits/coherence.rs
src/librustc/traits/coherence.rs
+2
-2
src/librustc/traits/error_reporting.rs
src/librustc/traits/error_reporting.rs
+13
-13
src/librustc/traits/fulfill.rs
src/librustc/traits/fulfill.rs
+5
-5
src/librustc/traits/mod.rs
src/librustc/traits/mod.rs
+1
-1
src/librustc/traits/project.rs
src/librustc/traits/project.rs
+3
-3
src/librustc/traits/query/dropck_outlives.rs
src/librustc/traits/query/dropck_outlives.rs
+1
-1
src/librustc/traits/query/type_op/custom.rs
src/librustc/traits/query/type_op/custom.rs
+1
-1
src/librustc/traits/select.rs
src/librustc/traits/select.rs
+3
-3
src/librustc/traits/specialize/mod.rs
src/librustc/traits/specialize/mod.rs
+1
-1
src/librustc_mir/borrow_check/nll/type_check/mod.rs
src/librustc_mir/borrow_check/nll/type_check/mod.rs
+1
-1
src/librustc_traits/chalk_context/mod.rs
src/librustc_traits/chalk_context/mod.rs
+1
-1
src/librustc_traits/chalk_context/program_clauses/mod.rs
src/librustc_traits/chalk_context/program_clauses/mod.rs
+1
-1
src/librustc_traits/chalk_context/resolvent_ops.rs
src/librustc_traits/chalk_context/resolvent_ops.rs
+2
-2
src/librustc_traits/implied_outlives_bounds.rs
src/librustc_traits/implied_outlives_bounds.rs
+1
-1
src/librustc_traits/normalize_erasing_regions.rs
src/librustc_traits/normalize_erasing_regions.rs
+1
-1
src/librustc_typeck/check/_match.rs
src/librustc_typeck/check/_match.rs
+1
-1
src/librustc_typeck/check/autoderef.rs
src/librustc_typeck/check/autoderef.rs
+3
-3
src/librustc_typeck/check/cast.rs
src/librustc_typeck/check/cast.rs
+2
-2
src/librustc_typeck/check/closure.rs
src/librustc_typeck/check/closure.rs
+2
-2
src/librustc_typeck/check/coercion.rs
src/librustc_typeck/check/coercion.rs
+1
-1
src/librustc_typeck/check/generator_interior.rs
src/librustc_typeck/check/generator_interior.rs
+1
-1
src/librustc_typeck/check/method/confirm.rs
src/librustc_typeck/check/method/confirm.rs
+1
-1
src/librustc_typeck/check/method/mod.rs
src/librustc_typeck/check/method/mod.rs
+1
-1
src/librustc_typeck/check/method/probe.rs
src/librustc_typeck/check/method/probe.rs
+3
-3
src/librustc_typeck/check/method/suggest.rs
src/librustc_typeck/check/method/suggest.rs
+1
-1
src/librustc_typeck/check/mod.rs
src/librustc_typeck/check/mod.rs
+13
-13
src/librustc_typeck/check/op.rs
src/librustc_typeck/check/op.rs
+1
-1
src/librustc_typeck/check/regionck.rs
src/librustc_typeck/check/regionck.rs
+1
-1
src/librustc_typeck/check/writeback.rs
src/librustc_typeck/check/writeback.rs
+4
-4
未找到文件。
src/librustc/infer/error_reporting/mod.rs
浏览文件 @
c94ba638
...
...
@@ -652,7 +652,7 @@ fn note_error_origin(
for
sp
in
prior_arms
{
err
.span_label
(
*
sp
,
format!
(
"this is found to be of type `{}`"
,
self
.resolve_
type_
vars_if_possible
(
&
last_ty
),
self
.resolve_vars_if_possible
(
&
last_ty
),
));
}
}
else
if
let
Some
(
sp
)
=
prior_arms
.last
()
{
...
...
@@ -1278,7 +1278,7 @@ fn expected_found_str_ty(
&
self
,
exp_found
:
&
ty
::
error
::
ExpectedFound
<
Ty
<
'tcx
>>
,
)
->
Option
<
(
DiagnosticStyledString
,
DiagnosticStyledString
)
>
{
let
exp_found
=
self
.resolve_
type_
vars_if_possible
(
exp_found
);
let
exp_found
=
self
.resolve_vars_if_possible
(
exp_found
);
if
exp_found
.references_error
()
{
return
None
;
}
...
...
@@ -1291,7 +1291,7 @@ fn expected_found_str<T: fmt::Display + TypeFoldable<'tcx>>(
&
self
,
exp_found
:
&
ty
::
error
::
ExpectedFound
<
T
>
,
)
->
Option
<
(
DiagnosticStyledString
,
DiagnosticStyledString
)
>
{
let
exp_found
=
self
.resolve_
type_
vars_if_possible
(
exp_found
);
let
exp_found
=
self
.resolve_vars_if_possible
(
exp_found
);
if
exp_found
.references_error
()
{
return
None
;
}
...
...
src/librustc/infer/error_reporting/need_type_info.rs
浏览文件 @
c94ba638
...
...
@@ -24,7 +24,7 @@ fn node_matches_type(&mut self, hir_id: HirId) -> bool {
});
match
ty_opt
{
Some
(
ty
)
=>
{
let
ty
=
self
.infcx
.resolve_
type_
vars_if_possible
(
&
ty
);
let
ty
=
self
.infcx
.resolve_vars_if_possible
(
&
ty
);
ty
.walk
()
.any
(|
inner_ty
|
{
inner_ty
==
self
.target_ty
||
match
(
&
inner_ty
.sty
,
&
self
.target_ty.sty
)
{
(
&
Infer
(
TyVar
(
a_vid
)),
&
Infer
(
TyVar
(
b_vid
)))
=>
{
...
...
@@ -94,7 +94,7 @@ pub fn need_type_info_err(
span
:
Span
,
ty
:
Ty
<
'tcx
>
)
->
DiagnosticBuilder
<
'gcx
>
{
let
ty
=
self
.resolve_
type_
vars_if_possible
(
&
ty
);
let
ty
=
self
.resolve_vars_if_possible
(
&
ty
);
let
name
=
self
.extract_type_name
(
&
ty
,
None
);
let
mut
err_span
=
span
;
...
...
@@ -166,7 +166,7 @@ pub fn need_type_info_err_in_generator(
span
:
Span
,
ty
:
Ty
<
'tcx
>
)
->
DiagnosticBuilder
<
'gcx
>
{
let
ty
=
self
.resolve_
type_
vars_if_possible
(
&
ty
);
let
ty
=
self
.resolve_vars_if_possible
(
&
ty
);
let
name
=
self
.extract_type_name
(
&
ty
,
None
);
let
mut
err
=
struct_span_err!
(
self
.tcx.sess
,
...
...
src/librustc/infer/error_reporting/nice_region_error/placeholder_error.rs
浏览文件 @
c94ba638
...
...
@@ -210,11 +210,11 @@ fn try_report_placeholders_trait(
_
=>
(),
}
let
expected_trait_ref
=
self
.infcx
.resolve_
type_
vars_if_possible
(
&
ty
::
TraitRef
{
let
expected_trait_ref
=
self
.infcx
.resolve_vars_if_possible
(
&
ty
::
TraitRef
{
def_id
:
trait_def_id
,
substs
:
expected_substs
,
});
let
actual_trait_ref
=
self
.infcx
.resolve_
type_
vars_if_possible
(
&
ty
::
TraitRef
{
let
actual_trait_ref
=
self
.infcx
.resolve_vars_if_possible
(
&
ty
::
TraitRef
{
def_id
:
trait_def_id
,
substs
:
actual_substs
,
});
...
...
src/librustc/infer/fudge.rs
浏览文件 @
c94ba638
...
...
@@ -74,7 +74,7 @@ pub fn fudge_inference_if_ok<T, E, F>(
let
(
mut
fudger
,
value
)
=
self
.probe
(|
snapshot
|
{
match
f
()
{
Ok
(
value
)
=>
{
let
value
=
self
.resolve_
type_
vars_if_possible
(
&
value
);
let
value
=
self
.resolve_vars_if_possible
(
&
value
);
// At this point, `value` could in principle refer
// to inference variables that have been created during
...
...
src/librustc/infer/mod.rs
浏览文件 @
c94ba638
...
...
@@ -1174,7 +1174,7 @@ pub fn set_tainted_by_errors(&self) {
/// Process the region constraints and report any errors that
/// result. After this, no more unification operations should be
/// done -- or the compiler will panic -- but it is legal to use
/// `resolve_
type_
vars_if_possible` as well as `fully_resolve`.
/// `resolve_vars_if_possible` as well as `fully_resolve`.
pub
fn
resolve_regions_and_report_errors
(
&
self
,
region_context
:
DefId
,
...
...
@@ -1262,7 +1262,7 @@ pub fn take_region_var_origins(&self) -> VarInfos {
}
pub
fn
ty_to_string
(
&
self
,
t
:
Ty
<
'tcx
>
)
->
String
{
self
.resolve_
type_
vars_if_possible
(
&
t
)
.to_string
()
self
.resolve_vars_if_possible
(
&
t
)
.to_string
()
}
pub
fn
tys_to_string
(
&
self
,
ts
:
&
[
Ty
<
'tcx
>
])
->
String
{
...
...
@@ -1271,7 +1271,7 @@ pub fn tys_to_string(&self, ts: &[Ty<'tcx>]) -> String {
}
pub
fn
trait_ref_to_string
(
&
self
,
t
:
&
ty
::
TraitRef
<
'tcx
>
)
->
String
{
self
.resolve_
type_
vars_if_possible
(
t
)
.to_string
()
self
.resolve_vars_if_possible
(
t
)
.to_string
()
}
/// If `TyVar(vid)` resolves to a type, return that type. Else, return the
...
...
@@ -1297,20 +1297,20 @@ pub fn root_var(&self, var: ty::TyVid) -> ty::TyVid {
self
.type_variables
.borrow_mut
()
.root_var
(
var
)
}
/// Where possible, replaces type/
int/floa
t variables in
/// Where possible, replaces type/
cons
t variables in
/// `value` with their final value. Note that region variables
/// are unaffected. If a type variable has not been unified, it
/// are unaffected. If a type
/const
variable has not been unified, it
/// is left as is. This is an idempotent operation that does
/// not affect inference state in any way and so you can do it
/// at will.
pub
fn
resolve_
type_
vars_if_possible
<
T
>
(
&
self
,
value
:
&
T
)
->
T
pub
fn
resolve_vars_if_possible
<
T
>
(
&
self
,
value
:
&
T
)
->
T
where
T
:
TypeFoldable
<
'tcx
>
,
{
if
!
value
.needs_infer
()
{
return
value
.clone
();
// avoid duplicated subst-folding
}
let
mut
r
=
resolve
::
Opportunistic
Type
Resolver
::
new
(
self
);
let
mut
r
=
resolve
::
Opportunistic
Var
Resolver
::
new
(
self
);
value
.fold_with
(
&
mut
r
)
}
...
...
@@ -1318,7 +1318,7 @@ pub fn resolve_type_vars_if_possible<T>(&self, value: &T) -> T
/// process of visiting `T`, this will resolve (where possible)
/// type variables in `T`, but it never constructs the final,
/// resolved type, so it's more efficient than
/// `resolve_
type_
vars_if_possible()`.
/// `resolve_vars_if_possible()`.
pub
fn
unresolved_type_vars
<
T
>
(
&
self
,
value
:
&
T
)
->
Option
<
(
Ty
<
'tcx
>
,
Option
<
Span
>
)
>
where
T
:
TypeFoldable
<
'tcx
>
,
...
...
@@ -1389,7 +1389,7 @@ pub fn type_error_struct_with_diag<M>(
where
M
:
FnOnce
(
String
)
->
DiagnosticBuilder
<
'tcx
>
,
{
let
actual_ty
=
self
.resolve_
type_
vars_if_possible
(
&
actual_ty
);
let
actual_ty
=
self
.resolve_vars_if_possible
(
&
actual_ty
);
debug!
(
"type_error_struct_with_diag({:?}, {:?})"
,
sp
,
actual_ty
);
// Don't report an error if actual type is `Error`.
...
...
@@ -1446,7 +1446,7 @@ pub fn type_is_copy_modulo_regions(
ty
:
Ty
<
'tcx
>
,
span
:
Span
,
)
->
bool
{
let
ty
=
self
.resolve_
type_
vars_if_possible
(
&
ty
);
let
ty
=
self
.resolve_vars_if_possible
(
&
ty
);
// Even if the type may have no inference variables, during
// type-checking closure types are in local tables only.
...
...
src/librustc/infer/opaque_types/mod.rs
浏览文件 @
c94ba638
...
...
@@ -284,9 +284,7 @@ pub fn constrain_opaque_type<FRR: FreeRegionRelations<'tcx>>(
debug!
(
"constrain_opaque_type: def_id={:?}"
,
def_id
);
debug!
(
"constrain_opaque_type: opaque_defn={:#?}"
,
opaque_defn
);
let
tcx
=
self
.tcx
;
let
concrete_ty
=
self
.resolve_type_vars_if_possible
(
&
opaque_defn
.concrete_ty
);
let
concrete_ty
=
self
.resolve_vars_if_possible
(
&
opaque_defn
.concrete_ty
);
debug!
(
"constrain_opaque_type: concrete_ty={:?}"
,
concrete_ty
);
...
...
src/librustc/infer/outlives/env.rs
浏览文件 @
c94ba638
...
...
@@ -168,7 +168,7 @@ pub fn add_implied_bounds(
debug!
(
"add_implied_bounds()"
);
for
&
ty
in
fn_sig_tys
{
let
ty
=
infcx
.resolve_
type_
vars_if_possible
(
&
ty
);
let
ty
=
infcx
.resolve_vars_if_possible
(
&
ty
);
debug!
(
"add_implied_bounds: ty = {}"
,
ty
);
let
implied_bounds
=
infcx
.implied_outlives_bounds
(
self
.param_env
,
body_id
,
ty
,
span
);
self
.add_outlives_bounds
(
Some
(
infcx
),
implied_bounds
)
...
...
src/librustc/infer/outlives/obligations.rs
浏览文件 @
c94ba638
...
...
@@ -177,7 +177,7 @@ pub fn process_registered_region_obligations(
sup_type
,
sub_region
,
origin
);
let
sup_type
=
self
.resolve_
type_
vars_if_possible
(
&
sup_type
);
let
sup_type
=
self
.resolve_vars_if_possible
(
&
sup_type
);
if
let
Some
(
region_bound_pairs
)
=
region_bound_pairs_map
.get
(
&
body_id
)
{
let
outlives
=
&
mut
TypeOutlives
::
new
(
...
...
@@ -215,7 +215,7 @@ pub fn type_must_outlive(
implicit_region_bound
,
param_env
,
);
let
ty
=
self
.resolve_
type_
vars_if_possible
(
&
ty
);
let
ty
=
self
.resolve_vars_if_possible
(
&
ty
);
outlives
.type_must_outlive
(
origin
,
ty
,
region
);
}
}
...
...
src/librustc/infer/resolve.rs
浏览文件 @
c94ba638
...
...
@@ -4,25 +4,25 @@
use
crate
::
ty
::
fold
::{
TypeFolder
,
TypeVisitor
};
///////////////////////////////////////////////////////////////////////////
// OPPORTUNISTIC
TYPE
RESOLVER
// OPPORTUNISTIC
KIND
RESOLVER
/// The opportunistic
type
resolver can be used at any time. It simply replaces
/// type variables that have been unified with the things they have
/// The opportunistic
kind
resolver can be used at any time. It simply replaces
/// type
/const
variables that have been unified with the things they have
/// been unified with (similar to `shallow_resolve`, but deep). This is
/// useful for printing messages etc but also required at various
/// points for correctness.
pub
struct
Opportunistic
Type
Resolver
<
'a
,
'gcx
:
'a
+
'tcx
,
'tcx
:
'a
>
{
pub
struct
Opportunistic
Var
Resolver
<
'a
,
'gcx
:
'a
+
'tcx
,
'tcx
:
'a
>
{
infcx
:
&
'a
InferCtxt
<
'a
,
'gcx
,
'tcx
>
,
}
impl
<
'a
,
'gcx
,
'tcx
>
Opportunistic
Type
Resolver
<
'a
,
'gcx
,
'tcx
>
{
impl
<
'a
,
'gcx
,
'tcx
>
Opportunistic
Var
Resolver
<
'a
,
'gcx
,
'tcx
>
{
#[inline]
pub
fn
new
(
infcx
:
&
'a
InferCtxt
<
'a
,
'gcx
,
'tcx
>
)
->
Self
{
Opportunistic
Type
Resolver
{
infcx
}
Opportunistic
Var
Resolver
{
infcx
}
}
}
impl
<
'a
,
'gcx
,
'tcx
>
TypeFolder
<
'gcx
,
'tcx
>
for
Opportunistic
Type
Resolver
<
'a
,
'gcx
,
'tcx
>
{
impl
<
'a
,
'gcx
,
'tcx
>
TypeFolder
<
'gcx
,
'tcx
>
for
Opportunistic
Var
Resolver
<
'a
,
'gcx
,
'tcx
>
{
fn
tcx
<
'b
>
(
&
'b
self
)
->
TyCtxt
<
'b
,
'gcx
,
'tcx
>
{
self
.infcx.tcx
}
...
...
src/librustc/middle/mem_categorization.rs
浏览文件 @
c94ba638
...
...
@@ -458,10 +458,10 @@ pub fn type_is_copy_modulo_regions(
.unwrap_or
(
true
)
}
fn
resolve_
type_
vars_if_possible
<
T
>
(
&
self
,
value
:
&
T
)
->
T
fn
resolve_vars_if_possible
<
T
>
(
&
self
,
value
:
&
T
)
->
T
where
T
:
TypeFoldable
<
'tcx
>
{
self
.infcx
.map
(|
infcx
|
infcx
.resolve_
type_
vars_if_possible
(
value
))
self
.infcx
.map
(|
infcx
|
infcx
.resolve_vars_if_possible
(
value
))
.unwrap_or_else
(||
value
.clone
())
}
...
...
@@ -475,7 +475,7 @@ fn resolve_type_vars_or_error(&self,
->
McResult
<
Ty
<
'tcx
>>
{
match
ty
{
Some
(
ty
)
=>
{
let
ty
=
self
.resolve_
type_
vars_if_possible
(
&
ty
);
let
ty
=
self
.resolve_vars_if_possible
(
&
ty
);
if
ty
.references_error
()
||
ty
.is_ty_var
()
{
debug!
(
"resolve_type_vars_or_error: error from {:?}"
,
ty
);
Err
(())
...
...
@@ -602,7 +602,7 @@ fn cat_expr_adjusted_with<F>(&self, expr: &hir::Expr,
where
F
:
FnOnce
()
->
McResult
<
cmt_
<
'tcx
>>
{
debug!
(
"cat_expr_adjusted_with({:?}): {:?}"
,
adjustment
,
expr
);
let
target
=
self
.resolve_
type_
vars_if_possible
(
&
adjustment
.target
);
let
target
=
self
.resolve_vars_if_possible
(
&
adjustment
.target
);
match
adjustment
.kind
{
adjustment
::
Adjust
::
Deref
(
overloaded
)
=>
{
// Equivalent to *expr or something similar.
...
...
src/librustc/traits/auto_trait.rs
浏览文件 @
c94ba638
...
...
@@ -307,9 +307,9 @@ fn evaluate_predicates<'b, 'gcx, 'c>(
continue
;
}
// Call infcx.resolve_
type_
vars_if_possible to see if we can
// Call infcx.resolve_vars_if_possible to see if we can
// get rid of any inference variables.
let
obligation
=
infcx
.resolve_
type_
vars_if_possible
(
let
obligation
=
infcx
.resolve_vars_if_possible
(
&
Obligation
::
new
(
dummy_cause
.clone
(),
new_env
,
pred
)
);
let
result
=
select
.select
(
&
obligation
);
...
...
@@ -642,7 +642,7 @@ fn evaluate_nested_obligations<
fresh_preds
.insert
(
self
.clean_pred
(
select
.infcx
(),
predicate
));
// Resolve any inference variables that we can, to help selection succeed
predicate
=
select
.infcx
()
.resolve_
type_
vars_if_possible
(
&
predicate
);
predicate
=
select
.infcx
()
.resolve_vars_if_possible
(
&
predicate
);
// We only add a predicate as a user-displayable bound if
// it involves a generic parameter, and doesn't contain
...
...
src/librustc/traits/chalk_fulfill.rs
浏览文件 @
c94ba638
...
...
@@ -33,7 +33,7 @@ fn in_environment(
obligation
:
PredicateObligation
<
'tcx
>
)
->
InEnvironment
<
'tcx
,
PredicateObligation
<
'tcx
>>
{
assert
!
(
!
infcx
.is_in_snapshot
());
let
obligation
=
infcx
.resolve_
type_
vars_if_possible
(
&
obligation
);
let
obligation
=
infcx
.resolve_vars_if_possible
(
&
obligation
);
let
environment
=
match
obligation
.param_env.def_id
{
Some
(
def_id
)
=>
infcx
.tcx
.environment
(
def_id
),
...
...
src/librustc/traits/codegen/mod.rs
浏览文件 @
c94ba638
...
...
@@ -153,7 +153,7 @@ fn drain_fulfillment_cx_or_panic<T>(&self,
bug!
(
"Encountered errors `{:?}` resolving bounds after type-checking"
,
errors
);
}
let
result
=
self
.resolve_
type_
vars_if_possible
(
result
);
let
result
=
self
.resolve_vars_if_possible
(
result
);
let
result
=
self
.tcx
.erase_regions
(
&
result
);
self
.tcx
.lift_to_global
(
&
result
)
.unwrap_or_else
(||
...
...
src/librustc/traits/coherence.rs
浏览文件 @
c94ba638
...
...
@@ -155,7 +155,7 @@ fn overlap_within_probe(
a_impl_header
.predicates
.iter
()
.chain
(
&
b_impl_header
.predicates
)
.map
(|
p
|
infcx
.resolve_
type_
vars_if_possible
(
p
))
.map
(|
p
|
infcx
.resolve_vars_if_possible
(
p
))
.map
(|
p
|
Obligation
{
cause
:
ObligationCause
::
dummy
(),
param_env
,
recursion_depth
:
0
,
...
...
@@ -171,7 +171,7 @@ fn overlap_within_probe(
return
None
}
let
impl_header
=
selcx
.infcx
()
.resolve_
type_
vars_if_possible
(
&
a_impl_header
);
let
impl_header
=
selcx
.infcx
()
.resolve_vars_if_possible
(
&
a_impl_header
);
let
intercrate_ambiguity_causes
=
selcx
.take_intercrate_ambiguity_causes
();
debug!
(
"overlap: intercrate_ambiguity_causes={:#?}"
,
intercrate_ambiguity_causes
);
...
...
src/librustc/traits/error_reporting.rs
浏览文件 @
c94ba638
...
...
@@ -186,7 +186,7 @@ fn report_projection_error(&self,
error
:
&
MismatchedProjectionTypes
<
'tcx
>
)
{
let
predicate
=
self
.resolve_
type_
vars_if_possible
(
&
obligation
.predicate
);
self
.resolve_vars_if_possible
(
&
obligation
.predicate
);
if
predicate
.references_error
()
{
return
...
...
@@ -531,7 +531,7 @@ pub fn report_overflow_error<T>(&self,
where
T
:
fmt
::
Display
+
TypeFoldable
<
'tcx
>
{
let
predicate
=
self
.resolve_
type_
vars_if_possible
(
&
obligation
.predicate
);
self
.resolve_vars_if_possible
(
&
obligation
.predicate
);
let
mut
err
=
struct_span_err!
(
self
.tcx.sess
,
obligation
.cause.span
,
E0275
,
"overflow evaluating the requirement `{}`"
,
predicate
);
...
...
@@ -553,7 +553,7 @@ pub fn report_overflow_error<T>(&self,
/// we do not suggest increasing the overflow limit, which is not
/// going to help).
pub
fn
report_overflow_error_cycle
(
&
self
,
cycle
:
&
[
PredicateObligation
<
'tcx
>
])
->
!
{
let
cycle
=
self
.resolve_
type_
vars_if_possible
(
&
cycle
.to_owned
());
let
cycle
=
self
.resolve_vars_if_possible
(
&
cycle
.to_owned
());
assert
!
(
cycle
.len
()
>
0
);
debug!
(
"report_overflow_error_cycle: cycle={:?}"
,
cycle
);
...
...
@@ -589,7 +589,7 @@ pub fn report_extra_impl_obligation(&self,
fn
get_parent_trait_ref
(
&
self
,
code
:
&
ObligationCauseCode
<
'tcx
>
)
->
Option
<
String
>
{
match
code
{
&
ObligationCauseCode
::
BuiltinDerivedObligation
(
ref
data
)
=>
{
let
parent_trait_ref
=
self
.resolve_
type_
vars_if_possible
(
let
parent_trait_ref
=
self
.resolve_vars_if_possible
(
&
data
.parent_trait_ref
);
match
self
.get_parent_trait_ref
(
&
data
.parent_code
)
{
Some
(
t
)
=>
Some
(
t
),
...
...
@@ -625,7 +625,7 @@ pub fn report_selection_error(
match
obligation
.predicate
{
ty
::
Predicate
::
Trait
(
ref
trait_predicate
)
=>
{
let
trait_predicate
=
self
.resolve_
type_
vars_if_possible
(
trait_predicate
);
self
.resolve_vars_if_possible
(
trait_predicate
);
if
self
.tcx.sess
.has_errors
()
&&
trait_predicate
.references_error
()
{
return
;
...
...
@@ -749,7 +749,7 @@ pub fn report_selection_error(
}
ty
::
Predicate
::
RegionOutlives
(
ref
predicate
)
=>
{
let
predicate
=
self
.resolve_
type_
vars_if_possible
(
predicate
);
let
predicate
=
self
.resolve_vars_if_possible
(
predicate
);
let
err
=
self
.region_outlives_predicate
(
&
obligation
.cause
,
&
predicate
)
.err
()
.unwrap
();
struct_span_err!
(
...
...
@@ -761,7 +761,7 @@ pub fn report_selection_error(
ty
::
Predicate
::
Projection
(
..
)
|
ty
::
Predicate
::
TypeOutlives
(
..
)
=>
{
let
predicate
=
self
.resolve_
type_
vars_if_possible
(
&
obligation
.predicate
);
self
.resolve_vars_if_possible
(
&
obligation
.predicate
);
struct_span_err!
(
self
.tcx.sess
,
span
,
E0280
,
"the requirement `{}` is not satisfied"
,
predicate
)
...
...
@@ -852,8 +852,8 @@ pub fn report_selection_error(
}
OutputTypeParameterMismatch
(
ref
found_trait_ref
,
ref
expected_trait_ref
,
_
)
=>
{
let
found_trait_ref
=
self
.resolve_
type_
vars_if_possible
(
&*
found_trait_ref
);
let
expected_trait_ref
=
self
.resolve_
type_
vars_if_possible
(
&*
expected_trait_ref
);
let
found_trait_ref
=
self
.resolve_vars_if_possible
(
&*
found_trait_ref
);
let
expected_trait_ref
=
self
.resolve_vars_if_possible
(
&*
expected_trait_ref
);
if
expected_trait_ref
.self_ty
()
.references_error
()
{
return
;
...
...
@@ -1345,7 +1345,7 @@ fn maybe_report_ambiguity(&self, obligation: &PredicateObligation<'tcx>,
// ambiguous impls. The latter *ought* to be a
// coherence violation, so we don't report it here.
let
predicate
=
self
.resolve_
type_
vars_if_possible
(
&
obligation
.predicate
);
let
predicate
=
self
.resolve_vars_if_possible
(
&
obligation
.predicate
);
let
span
=
obligation
.cause.span
;
debug!
(
"maybe_report_ambiguity(predicate={:?}, obligation={:?})"
,
...
...
@@ -1617,7 +1617,7 @@ fn note_obligation_cause_code<T>(&self,
err
.note
(
"shared static variables must have a type that implements `Sync`"
);
}
ObligationCauseCode
::
BuiltinDerivedObligation
(
ref
data
)
=>
{
let
parent_trait_ref
=
self
.resolve_
type_
vars_if_possible
(
&
data
.parent_trait_ref
);
let
parent_trait_ref
=
self
.resolve_vars_if_possible
(
&
data
.parent_trait_ref
);
let
ty
=
parent_trait_ref
.skip_binder
()
.self_ty
();
err
.note
(
&
format!
(
"required because it appears within the type `{}`"
,
ty
));
obligated_types
.push
(
ty
);
...
...
@@ -1631,7 +1631,7 @@ fn note_obligation_cause_code<T>(&self,
}
}
ObligationCauseCode
::
ImplDerivedObligation
(
ref
data
)
=>
{
let
parent_trait_ref
=
self
.resolve_
type_
vars_if_possible
(
&
data
.parent_trait_ref
);
let
parent_trait_ref
=
self
.resolve_vars_if_possible
(
&
data
.parent_trait_ref
);
err
.note
(
&
format!
(
"required because of the requirements on the impl of `{}` for `{}`"
,
parent_trait_ref
,
...
...
@@ -1672,7 +1672,7 @@ fn is_recursive_obligation(&self,
obligated_types
:
&
mut
Vec
<&
ty
::
TyS
<
'tcx
>>
,
cause_code
:
&
ObligationCauseCode
<
'tcx
>
)
->
bool
{
if
let
ObligationCauseCode
::
BuiltinDerivedObligation
(
ref
data
)
=
cause_code
{
let
parent_trait_ref
=
self
.resolve_
type_
vars_if_possible
(
&
data
.parent_trait_ref
);
let
parent_trait_ref
=
self
.resolve_vars_if_possible
(
&
data
.parent_trait_ref
);
if
obligated_types
.iter
()
.any
(|
ot
|
ot
==
&
parent_trait_ref
.skip_binder
()
.self_ty
())
{
return
true
;
...
...
src/librustc/traits/fulfill.rs
浏览文件 @
c94ba638
...
...
@@ -178,7 +178,7 @@ fn register_predicate_obligation<'a, 'gcx>(&mut self,
{
// this helps to reduce duplicate errors, as well as making
// debug output much nicer to read and so on.
let
obligation
=
infcx
.resolve_
type_
vars_if_possible
(
&
obligation
);
let
obligation
=
infcx
.resolve_vars_if_possible
(
&
obligation
);
debug!
(
"register_predicate_obligation(obligation={:?})"
,
obligation
);
...
...
@@ -261,7 +261,7 @@ fn process_obligation(&mut self,
})
{
debug!
(
"process_predicate: pending obligation {:?} still stalled on {:?}"
,
self
.selcx
.infcx
()
.resolve_
type_
vars_if_possible
(
&
pending_obligation
.obligation
),
.resolve_vars_if_possible
(
&
pending_obligation
.obligation
),
pending_obligation
.stalled_on
);
return
ProcessResult
::
Unchanged
;
}
...
...
@@ -272,7 +272,7 @@ fn process_obligation(&mut self,
if
obligation
.predicate
.has_infer_types
()
{
obligation
.predicate
=
self
.selcx
.infcx
()
.resolve_
type_
vars_if_possible
(
&
obligation
.predicate
);
self
.selcx
.infcx
()
.resolve_vars_if_possible
(
&
obligation
.predicate
);
}
debug!
(
"process_obligation: obligation = {:?}"
,
obligation
);
...
...
@@ -318,7 +318,7 @@ fn process_obligation(&mut self,
trait_ref_type_vars
(
self
.selcx
,
data
.to_poly_trait_ref
());
debug!
(
"process_predicate: pending obligation {:?} now stalled on {:?}"
,
self
.selcx
.infcx
()
.resolve_
type_
vars_if_possible
(
obligation
),
self
.selcx
.infcx
()
.resolve_vars_if_possible
(
obligation
),
pending_obligation
.stalled_on
);
ProcessResult
::
Unchanged
...
...
@@ -519,7 +519,7 @@ fn trait_ref_type_vars<'a, 'gcx, 'tcx>(selcx: &mut SelectionContext<'a, 'gcx, 't
{
t
.skip_binder
()
// ok b/c this check doesn't care about regions
.input_types
()
.map
(|
t
|
selcx
.infcx
()
.resolve_
type_
vars_if_possible
(
&
t
))
.map
(|
t
|
selcx
.infcx
()
.resolve_vars_if_possible
(
&
t
))
.filter
(|
t
|
t
.has_infer_types
())
.flat_map
(|
t
|
t
.walk
())
.filter
(|
t
|
match
t
.sty
{
ty
::
Infer
(
_
)
=>
true
,
_
=>
false
})
...
...
src/librustc/traits/mod.rs
浏览文件 @
c94ba638
...
...
@@ -927,7 +927,7 @@ pub fn fully_normalize<'a, 'gcx, 'tcx, T>(
debug!
(
"fully_normalize: select_all_or_error start"
);
fulfill_cx
.select_all_or_error
(
infcx
)
?
;
debug!
(
"fully_normalize: select_all_or_error complete"
);
let
resolved_value
=
infcx
.resolve_
type_
vars_if_possible
(
&
normalized_value
);
let
resolved_value
=
infcx
.resolve_vars_if_possible
(
&
normalized_value
);
debug!
(
"fully_normalize: resolved_value={:?}"
,
resolved_value
);
Ok
(
resolved_value
)
}
...
...
src/librustc/traits/project.rs
浏览文件 @
c94ba638
...
...
@@ -312,7 +312,7 @@ fn new(selcx: &'a mut SelectionContext<'b, 'gcx, 'tcx>,
}
fn
fold
<
T
:
TypeFoldable
<
'tcx
>>
(
&
mut
self
,
value
:
&
T
)
->
T
{
let
value
=
self
.selcx
.infcx
()
.resolve_
type_
vars_if_possible
(
value
);
let
value
=
self
.selcx
.infcx
()
.resolve_vars_if_possible
(
value
);
if
!
value
.has_projections
()
{
value
...
...
@@ -508,7 +508,7 @@ fn opt_normalize_projection_type<'a, 'b, 'gcx, 'tcx>(
{
let
infcx
=
selcx
.infcx
();
let
projection_ty
=
infcx
.resolve_
type_
vars_if_possible
(
&
projection_ty
);
let
projection_ty
=
infcx
.resolve_vars_if_possible
(
&
projection_ty
);
let
cache_key
=
ProjectionCacheKey
{
ty
:
projection_ty
};
debug!
(
"opt_normalize_projection_type(
\
...
...
@@ -1614,7 +1614,7 @@ pub fn from_poly_projection_predicate(selcx: &mut SelectionContext<'cx, 'gcx, 't
// from a specific call to `opt_normalize_projection_type` - if
// there's no precise match, the original cache entry is "stranded"
// anyway.
ty
:
infcx
.resolve_
type_
vars_if_possible
(
&
predicate
.projection_ty
)
ty
:
infcx
.resolve_vars_if_possible
(
&
predicate
.projection_ty
)
})
}
}
...
...
src/librustc/traits/query/dropck_outlives.rs
浏览文件 @
c94ba638
...
...
@@ -54,7 +54,7 @@ pub fn dropck_outlives(&self, ty: Ty<'tcx>) -> InferOk<'tcx, Vec<Kind<'tcx>>> {
&
orig_values
,
result
)
{
let
ty
=
self
.infcx
.resolve_
type_
vars_if_possible
(
&
ty
);
let
ty
=
self
.infcx
.resolve_vars_if_possible
(
&
ty
);
let
kinds
=
value
.into_kinds_reporting_overflows
(
tcx
,
span
,
ty
);
return
InferOk
{
value
:
kinds
,
...
...
src/librustc/traits/query/type_op/custom.rs
浏览文件 @
c94ba638
...
...
@@ -97,7 +97,7 @@ fn scrape_region_constraints<'gcx, 'tcx, R>(
region_obligations
.iter
()
.map
(|(
_
,
r_o
)|
(
r_o
.sup_type
,
r_o
.sub_region
))
.map
(|(
ty
,
r
)|
(
infcx
.resolve_
type_
vars_if_possible
(
&
ty
),
r
)),
.map
(|(
ty
,
r
)|
(
infcx
.resolve_vars_if_possible
(
&
ty
),
r
)),
&
region_constraint_data
,
);
...
...
src/librustc/traits/select.rs
浏览文件 @
c94ba638
...
...
@@ -1463,7 +1463,7 @@ fn is_knowable<'o>(&mut self, stack: &TraitObligationStack<'o, 'tcx>) -> Option<
let
obligation
=
&
stack
.obligation
;
let
predicate
=
self
.infcx
()
.resolve_
type_
vars_if_possible
(
&
obligation
.predicate
);
.resolve_vars_if_possible
(
&
obligation
.predicate
);
// OK to skip binder because of the nature of the
// trait-ref-is-knowable check, which does not care about
...
...
@@ -1621,7 +1621,7 @@ fn assemble_candidates<'o>(
cause
:
obligation
.cause
.clone
(),
recursion_depth
:
obligation
.recursion_depth
,
predicate
:
self
.infcx
()
.resolve_
type_
vars_if_possible
(
&
obligation
.predicate
),
.resolve_vars_if_possible
(
&
obligation
.predicate
),
};
if
obligation
.predicate
.skip_binder
()
.self_ty
()
.is_ty_var
()
{
...
...
@@ -1737,7 +1737,7 @@ fn match_projection_obligation_against_definition_bounds(
snapshot
:
&
CombinedSnapshot
<
'_
,
'tcx
>
,
)
->
bool
{
let
poly_trait_predicate
=
self
.infcx
()
.resolve_
type_
vars_if_possible
(
&
obligation
.predicate
);
.resolve_vars_if_possible
(
&
obligation
.predicate
);
let
(
placeholder_trait_predicate
,
placeholder_map
)
=
self
.infcx
()
.replace_bound_vars_with_placeholders
(
&
poly_trait_predicate
);
debug!
(
...
...
src/librustc/traits/specialize/mod.rs
浏览文件 @
c94ba638
...
...
@@ -278,7 +278,7 @@ fn fulfill_implication<'a, 'gcx, 'tcx>(infcx: &InferCtxt<'a, 'gcx, 'tcx>,
// Now resolve the *substitution* we built for the target earlier, replacing
// the inference variables inside with whatever we got from fulfillment.
Ok
(
infcx
.resolve_
type_
vars_if_possible
(
&
target_substs
))
Ok
(
infcx
.resolve_vars_if_possible
(
&
target_substs
))
}
}
})
...
...
src/librustc_mir/borrow_check/nll/type_check/mod.rs
浏览文件 @
c94ba638
...
...
@@ -1263,7 +1263,7 @@ fn eq_opaque_type_and_type(
debug!
(
"eq_opaque_type_and_type: concrete_ty={:?}={:?} opaque_defn_ty={:?}"
,
opaque_decl
.concrete_ty
,
infcx
.resolve_
type_
vars_if_possible
(
&
opaque_decl
.concrete_ty
),
infcx
.resolve_vars_if_possible
(
&
opaque_decl
.concrete_ty
),
opaque_defn_ty
);
obligations
.add
(
infcx
...
...
src/librustc_traits/chalk_context/mod.rs
浏览文件 @
c94ba638
...
...
@@ -411,7 +411,7 @@ fn instantiate_binders_existentially(
}
fn
debug_ex_clause
(
&
mut
self
,
value
:
&
'v
ChalkExClause
<
'tcx
>
)
->
Box
<
dyn
Debug
+
'v
>
{
let
string
=
format!
(
"{:?}"
,
self
.infcx
.resolve_
type_
vars_if_possible
(
value
));
let
string
=
format!
(
"{:?}"
,
self
.infcx
.resolve_vars_if_possible
(
value
));
Box
::
new
(
string
)
}
...
...
src/librustc_traits/chalk_context/program_clauses/mod.rs
浏览文件 @
c94ba638
...
...
@@ -57,7 +57,7 @@ pub(super) fn program_clauses_impl(
use
rustc
::
traits
::
WhereClause
::
*
;
use
rustc
::
infer
::
canonical
::
OriginalQueryValues
;
let
goal
=
self
.infcx
.resolve_
type_
vars_if_possible
(
goal
);
let
goal
=
self
.infcx
.resolve_vars_if_possible
(
goal
);
debug!
(
"program_clauses(goal = {:?})"
,
goal
);
...
...
src/librustc_traits/chalk_context/resolvent_ops.rs
浏览文件 @
c94ba638
...
...
@@ -111,8 +111,8 @@ fn apply_answer_subst(
)
->
Fallible
<
ChalkExClause
<
'tcx
>>
{
debug!
(
"apply_answer_subst(ex_clause = {:?}, selected_goal = {:?})"
,
self
.infcx
.resolve_
type_
vars_if_possible
(
&
ex_clause
),
self
.infcx
.resolve_
type_
vars_if_possible
(
selected_goal
)
self
.infcx
.resolve_vars_if_possible
(
&
ex_clause
),
self
.infcx
.resolve_vars_if_possible
(
selected_goal
)
);
let
(
answer_subst
,
_
)
=
self
.infcx
.instantiate_canonical_with_fresh_inference_vars
(
...
...
src/librustc_traits/implied_outlives_bounds.rs
浏览文件 @
c94ba638
...
...
@@ -121,7 +121,7 @@ fn compute_implied_outlives_bounds<'tcx>(
ty
::
Predicate
::
TypeOutlives
(
ref
data
)
=>
match
data
.no_bound_vars
()
{
None
=>
vec!
[],
Some
(
ty
::
OutlivesPredicate
(
ty_a
,
r_b
))
=>
{
let
ty_a
=
infcx
.resolve_
type_
vars_if_possible
(
&
ty_a
);
let
ty_a
=
infcx
.resolve_vars_if_possible
(
&
ty_a
);
let
mut
components
=
smallvec!
[];
tcx
.push_outlives_components
(
ty_a
,
&
mut
components
);
implied_bounds_from_components
(
r_b
,
components
)
...
...
src/librustc_traits/normalize_erasing_regions.rs
浏览文件 @
c94ba638
...
...
@@ -36,7 +36,7 @@ fn normalize_ty_after_erasing_regions<'tcx>(
None
,
);
let
normalized_value
=
infcx
.resolve_
type_
vars_if_possible
(
&
normalized_value
);
let
normalized_value
=
infcx
.resolve_vars_if_possible
(
&
normalized_value
);
let
normalized_value
=
infcx
.tcx
.erase_regions
(
&
normalized_value
);
tcx
.lift_to_global
(
&
normalized_value
)
.unwrap
()
}
...
...
src/librustc_typeck/check/_match.rs
浏览文件 @
c94ba638
...
...
@@ -226,7 +226,7 @@ pub fn check_pat_walk(
// Now that we know the types can be unified we find the unified type and use
// it to type the entire expression.
let
common_type
=
self
.resolve_
type_
vars_if_possible
(
&
lhs_ty
);
let
common_type
=
self
.resolve_vars_if_possible
(
&
lhs_ty
);
// subtyping doesn't matter here, as the value is some kind of scalar
self
.demand_eqtype_pat
(
pat
.span
,
expected
,
lhs_ty
,
discrim_span
);
...
...
src/librustc_typeck/check/autoderef.rs
浏览文件 @
c94ba638
...
...
@@ -98,7 +98,7 @@ pub fn new(infcx: &'a InferCtxt<'a, 'gcx, 'tcx>,
body_id
,
param_env
,
steps
:
vec!
[],
cur_ty
:
infcx
.resolve_
type_
vars_if_possible
(
&
base_ty
),
cur_ty
:
infcx
.resolve_vars_if_possible
(
&
base_ty
),
obligations
:
vec!
[],
at_start
:
true
,
include_raw_pointers
:
false
,
...
...
@@ -152,7 +152,7 @@ fn overloaded_deref_ty(&mut self, ty: Ty<'tcx>) -> Option<Ty<'tcx>> {
ty
,
normalized_ty
,
obligations
);
self
.obligations
.extend
(
obligations
);
Some
(
self
.infcx
.resolve_
type_
vars_if_possible
(
&
normalized_ty
))
Some
(
self
.infcx
.resolve_vars_if_possible
(
&
normalized_ty
))
}
/// Returns the final type, generating an error if it is an
...
...
@@ -164,7 +164,7 @@ pub fn unambiguous_final_ty(&self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) -> Ty<'tcx> {
/// Returns the final type we ended up with, which may well be an
/// inference variable (we will resolve it first, if possible).
pub
fn
maybe_ambiguous_final_ty
(
&
self
)
->
Ty
<
'tcx
>
{
self
.infcx
.resolve_
type_
vars_if_possible
(
&
self
.cur_ty
)
self
.infcx
.resolve_vars_if_possible
(
&
self
.cur_ty
)
}
pub
fn
step_count
(
&
self
)
->
usize
{
...
...
src/librustc_typeck/check/cast.rs
浏览文件 @
c94ba638
...
...
@@ -82,7 +82,7 @@ fn pointer_kind(&self, t: Ty<'tcx>, span: Span) ->
{
debug!
(
"pointer_kind({:?}, {:?})"
,
t
,
span
);
let
t
=
self
.resolve_
type_
vars_if_possible
(
&
t
);
let
t
=
self
.resolve_vars_if_possible
(
&
t
);
if
t
.references_error
()
{
return
Err
(
ErrorReported
);
...
...
@@ -334,7 +334,7 @@ fn report_cast_to_unsized_type(&self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) {
let
tstr
=
fcx
.ty_to_string
(
self
.cast_ty
);
let
mut
err
=
type_error_struct!
(
fcx
.tcx.sess
,
self
.span
,
self
.expr_ty
,
E0620
,
"cast to unsized type: `{}` as `{}`"
,
fcx
.resolve_
type_
vars_if_possible
(
&
self
.expr_ty
),
fcx
.resolve_vars_if_possible
(
&
self
.expr_ty
),
tstr
);
match
self
.expr_ty.sty
{
ty
::
Ref
(
_
,
_
,
mt
)
=>
{
...
...
src/librustc_typeck/check/closure.rs
浏览文件 @
c94ba638
...
...
@@ -282,7 +282,7 @@ fn deduce_sig_from_projection(
let
input_tys
=
if
is_fn
{
let
arg_param_ty
=
trait_ref
.skip_binder
()
.substs
.type_at
(
1
);
let
arg_param_ty
=
self
.resolve_
type_
vars_if_possible
(
&
arg_param_ty
);
let
arg_param_ty
=
self
.resolve_vars_if_possible
(
&
arg_param_ty
);
debug!
(
"deduce_sig_from_projection: arg_param_ty={:?}"
,
arg_param_ty
);
match
arg_param_ty
.sty
{
...
...
@@ -295,7 +295,7 @@ fn deduce_sig_from_projection(
};
let
ret_param_ty
=
projection
.skip_binder
()
.ty
;
let
ret_param_ty
=
self
.resolve_
type_
vars_if_possible
(
&
ret_param_ty
);
let
ret_param_ty
=
self
.resolve_vars_if_possible
(
&
ret_param_ty
);
debug!
(
"deduce_sig_from_projection: ret_param_ty={:?}"
,
ret_param_ty
);
let
sig
=
self
.tcx
.mk_fn_sig
(
...
...
src/librustc_typeck/check/coercion.rs
浏览文件 @
c94ba638
...
...
@@ -575,7 +575,7 @@ fn coerce_unsized(&self, source: Ty<'tcx>, target: Ty<'tcx>) -> CoerceResult<'tc
// Uncertain or unimplemented.
Ok
(
None
)
=>
{
if
trait_ref
.def_id
()
==
unsize_did
{
let
trait_ref
=
self
.resolve_
type_
vars_if_possible
(
&
trait_ref
);
let
trait_ref
=
self
.resolve_vars_if_possible
(
&
trait_ref
);
let
self_ty
=
trait_ref
.skip_binder
()
.self_ty
();
let
unsize_ty
=
trait_ref
.skip_binder
()
.input_types
()
.nth
(
1
)
.unwrap
();
debug!
(
"coerce_unsized: ambiguous unsize case for {:?}"
,
trait_ref
);
...
...
src/librustc_typeck/check/generator_interior.rs
浏览文件 @
c94ba638
...
...
@@ -48,7 +48,7 @@ fn record(&mut self,
});
if
let
Some
(
yield_span
)
=
live_across_yield
{
let
ty
=
self
.fcx
.resolve_
type_
vars_if_possible
(
&
ty
);
let
ty
=
self
.fcx
.resolve_vars_if_possible
(
&
ty
);
debug!
(
"type in expr = {:?}, scope = {:?}, type = {:?}, count = {}, yield_span = {:?}"
,
expr
,
scope
,
ty
,
self
.expr_count
,
yield_span
);
...
...
src/librustc_typeck/check/method/confirm.rs
浏览文件 @
c94ba638
...
...
@@ -511,7 +511,7 @@ fn convert_place_op_to_mutable(&self,
let
base_ty
=
self
.tables
.borrow
()
.expr_adjustments
(
base_expr
)
.last
()
.map_or_else
(||
self
.node_ty
(
expr
.hir_id
),
|
adj
|
adj
.target
);
let
base_ty
=
self
.resolve_
type_
vars_if_possible
(
&
base_ty
);
let
base_ty
=
self
.resolve_vars_if_possible
(
&
base_ty
);
// Need to deref because overloaded place ops take self by-reference.
let
base_ty
=
base_ty
.builtin_deref
(
false
)
...
...
src/librustc_typeck/check/method/mod.rs
浏览文件 @
c94ba638
...
...
@@ -253,7 +253,7 @@ fn lookup_probe(&self,
scope
:
ProbeScope
)
->
probe
::
PickResult
<
'tcx
>
{
let
mode
=
probe
::
Mode
::
MethodCall
;
let
self_ty
=
self
.resolve_
type_
vars_if_possible
(
&
self_ty
);
let
self_ty
=
self
.resolve_vars_if_possible
(
&
self_ty
);
self
.probe_for_name
(
span
,
mode
,
method_name
,
IsSuggestion
(
false
),
self_ty
,
call_expr
.hir_id
,
scope
)
}
...
...
src/librustc_typeck/check/method/probe.rs
浏览文件 @
c94ba638
...
...
@@ -1338,7 +1338,7 @@ fn consider_probe(&self,
// and point at it rather than reporting the entire
// trait-ref?
result
=
ProbeResult
::
NoMatch
;
let
trait_ref
=
self
.resolve_
type_
vars_if_possible
(
&
trait_ref
);
let
trait_ref
=
self
.resolve_vars_if_possible
(
&
trait_ref
);
possibly_unsatisfied_predicates
.push
(
trait_ref
);
}
}
...
...
@@ -1351,7 +1351,7 @@ fn consider_probe(&self,
// Evaluate those obligations to see if they might possibly hold.
for
o
in
candidate_obligations
.into_iter
()
.chain
(
sub_obligations
)
{
let
o
=
self
.resolve_
type_
vars_if_possible
(
&
o
);
let
o
=
self
.resolve_vars_if_possible
(
&
o
);
if
!
self
.predicate_may_hold
(
&
o
)
{
result
=
ProbeResult
::
NoMatch
;
if
let
&
ty
::
Predicate
::
Trait
(
ref
pred
)
=
&
o
.predicate
{
...
...
@@ -1364,7 +1364,7 @@ fn consider_probe(&self,
if
let
(
Some
(
return_ty
),
Some
(
xform_ret_ty
))
=
(
self
.return_type
,
probe
.xform_ret_ty
)
{
let
xform_ret_ty
=
self
.resolve_
type_
vars_if_possible
(
&
xform_ret_ty
);
let
xform_ret_ty
=
self
.resolve_vars_if_possible
(
&
xform_ret_ty
);
debug!
(
"comparing return_ty {:?} with xform ret ty {:?}"
,
return_ty
,
probe
.xform_ret_ty
);
...
...
src/librustc_typeck/check/method/suggest.rs
浏览文件 @
c94ba638
...
...
@@ -196,7 +196,7 @@ pub fn report_method_error<'b>(
})
=>
{
let
tcx
=
self
.tcx
;
let
actual
=
self
.resolve_
type_
vars_if_possible
(
&
rcvr_ty
);
let
actual
=
self
.resolve_vars_if_possible
(
&
rcvr_ty
);
let
ty_str
=
self
.ty_to_string
(
actual
);
let
is_method
=
mode
==
Mode
::
MethodCall
;
let
item_kind
=
if
is_method
{
...
...
src/librustc_typeck/check/mod.rs
浏览文件 @
c94ba638
...
...
@@ -330,13 +330,13 @@ fn resolve(self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) -> Expectation<'tcx> {
match
self
{
NoExpectation
=>
NoExpectation
,
ExpectCastableToType
(
t
)
=>
{
ExpectCastableToType
(
fcx
.resolve_
type_
vars_if_possible
(
&
t
))
ExpectCastableToType
(
fcx
.resolve_vars_if_possible
(
&
t
))
}
ExpectHasType
(
t
)
=>
{
ExpectHasType
(
fcx
.resolve_
type_
vars_if_possible
(
&
t
))
ExpectHasType
(
fcx
.resolve_vars_if_possible
(
&
t
))
}
ExpectRvalueLikeUnsized
(
t
)
=>
{
ExpectRvalueLikeUnsized
(
fcx
.resolve_
type_
vars_if_possible
(
&
t
))
ExpectRvalueLikeUnsized
(
fcx
.resolve_vars_if_possible
(
&
t
))
}
}
}
...
...
@@ -2067,7 +2067,7 @@ pub fn misc(&self, span: Span) -> ObligationCause<'tcx> {
}
/// Resolves type variables in `ty` if possible. Unlike the infcx
/// version (resolve_
type_
vars_if_possible), this version will
/// version (resolve_vars_if_possible), this version will
/// also select obligations if it seems useful, in an effort
/// to get more type information.
fn
resolve_type_vars_with_obligations
(
&
self
,
mut
ty
:
Ty
<
'tcx
>
)
->
Ty
<
'tcx
>
{
...
...
@@ -2080,7 +2080,7 @@ fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
}
// If `ty` is a type variable, see whether we already know what it is.
ty
=
self
.resolve_
type_
vars_if_possible
(
&
ty
);
ty
=
self
.resolve_vars_if_possible
(
&
ty
);
if
!
ty
.has_infer_types
()
{
debug!
(
"resolve_type_vars_with_obligations: ty={:?}"
,
ty
);
return
ty
;
...
...
@@ -2091,7 +2091,7 @@ fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
// indirect dependencies that don't seem worth tracking
// precisely.
self
.select_obligations_where_possible
(
false
);
ty
=
self
.resolve_
type_
vars_if_possible
(
&
ty
);
ty
=
self
.resolve_vars_if_possible
(
&
ty
);
debug!
(
"resolve_type_vars_with_obligations: ty={:?}"
,
ty
);
ty
...
...
@@ -2127,7 +2127,7 @@ pub fn local_ty(&self, span: Span, nid: hir::HirId) -> LocalTy<'tcx> {
#[inline]
pub
fn
write_ty
(
&
self
,
id
:
hir
::
HirId
,
ty
:
Ty
<
'tcx
>
)
{
debug!
(
"write_ty({:?}, {:?}) in fcx {}"
,
id
,
self
.resolve_
type_
vars_if_possible
(
&
ty
),
self
.tag
());
id
,
self
.resolve_vars_if_possible
(
&
ty
),
self
.tag
());
self
.tables
.borrow_mut
()
.node_types_mut
()
.insert
(
id
,
ty
);
if
ty
.references_error
()
{
...
...
@@ -2950,9 +2950,9 @@ fn check_argument_types(&self,
}
else
{
// is the missing argument of type `()`?
let
sugg_unit
=
if
expected_arg_tys
.len
()
==
1
&&
supplied_arg_count
==
0
{
self
.resolve_
type_
vars_if_possible
(
&
expected_arg_tys
[
0
])
.is_unit
()
self
.resolve_vars_if_possible
(
&
expected_arg_tys
[
0
])
.is_unit
()
}
else
if
fn_inputs
.len
()
==
1
&&
supplied_arg_count
==
0
{
self
.resolve_
type_
vars_if_possible
(
&
fn_inputs
[
0
])
.is_unit
()
self
.resolve_vars_if_possible
(
&
fn_inputs
[
0
])
.is_unit
()
}
else
{
false
};
...
...
@@ -3063,7 +3063,7 @@ fn variadic_error<'tcx>(s: &Session, span: Span, t: Ty<'tcx>, cast_ty: &str) {
}
ty
::
FnDef
(
..
)
=>
{
let
ptr_ty
=
self
.tcx
.mk_fn_ptr
(
arg_ty
.fn_sig
(
self
.tcx
));
let
ptr_ty
=
self
.resolve_
type_
vars_if_possible
(
&
ptr_ty
);
let
ptr_ty
=
self
.resolve_vars_if_possible
(
&
ptr_ty
);
variadic_error
(
tcx
.sess
,
arg
.span
,
arg_ty
,
&
ptr_ty
.to_string
());
}
_
=>
{}
...
...
@@ -3253,7 +3253,7 @@ fn expected_inputs_for_expected_output(&self,
// Record all the argument types, with the substitutions
// produced from the above subtyping unification.
Ok
(
formal_args
.iter
()
.map
(|
ty
|
{
self
.resolve_
type_
vars_if_possible
(
ty
)
self
.resolve_vars_if_possible
(
ty
)
})
.collect
())
})
.unwrap_or_default
();
debug!
(
"expected_inputs_for_expected_output(formal={:?} -> {:?}, expected={:?} -> {:?})"
,
...
...
@@ -4333,9 +4333,9 @@ fn check_expr_kind(
// Find the type of `e`. Supply hints based on the type we are casting to,
// if appropriate.
let
t_cast
=
self
.to_ty_saving_user_provided_ty
(
t
);
let
t_cast
=
self
.resolve_
type_
vars_if_possible
(
&
t_cast
);
let
t_cast
=
self
.resolve_vars_if_possible
(
&
t_cast
);
let
t_expr
=
self
.check_expr_with_expectation
(
e
,
ExpectCastableToType
(
t_cast
));
let
t_cast
=
self
.resolve_
type_
vars_if_possible
(
&
t_cast
);
let
t_cast
=
self
.resolve_vars_if_possible
(
&
t_cast
);
// Eagerly check for some obvious errors.
if
t_expr
.references_error
()
||
t_cast
.references_error
()
{
...
...
src/librustc_typeck/check/op.rs
浏览文件 @
c94ba638
...
...
@@ -618,7 +618,7 @@ pub fn check_user_unop(&self,
method
.sig
.output
()
}
Err
(())
=>
{
let
actual
=
self
.resolve_
type_
vars_if_possible
(
&
operand_ty
);
let
actual
=
self
.resolve_vars_if_possible
(
&
operand_ty
);
if
!
actual
.references_error
()
{
let
mut
err
=
struct_span_err!
(
self
.tcx.sess
,
ex
.span
,
E0600
,
"cannot apply unary operator `{}` to type `{}`"
,
...
...
src/librustc_typeck/check/regionck.rs
浏览文件 @
c94ba638
...
...
@@ -270,7 +270,7 @@ fn set_repeating_scope(&mut self, scope: hir::HirId) -> hir::HirId {
/// of b will be `&<R0>.i32` and then `*b` will require that `<R0>` be bigger than the let and
/// the `*b` expression, so we will effectively resolve `<R0>` to be the block B.
pub
fn
resolve_type
(
&
self
,
unresolved_ty
:
Ty
<
'tcx
>
)
->
Ty
<
'tcx
>
{
self
.resolve_
type_
vars_if_possible
(
&
unresolved_ty
)
self
.resolve_vars_if_possible
(
&
unresolved_ty
)
}
/// Try to resolve the type for the given node.
...
...
src/librustc_typeck/check/writeback.rs
浏览文件 @
c94ba638
...
...
@@ -138,7 +138,7 @@ fn fix_scalar_builtin_expr(&mut self, e: &hir::Expr) {
hir
::
ExprKind
::
Unary
(
hir
::
UnNeg
,
ref
inner
)
|
hir
::
ExprKind
::
Unary
(
hir
::
UnNot
,
ref
inner
)
=>
{
let
inner_ty
=
self
.fcx
.node_ty
(
inner
.hir_id
);
let
inner_ty
=
self
.fcx
.resolve_
type_
vars_if_possible
(
&
inner_ty
);
let
inner_ty
=
self
.fcx
.resolve_vars_if_possible
(
&
inner_ty
);
if
inner_ty
.is_scalar
()
{
let
mut
tables
=
self
.fcx.tables
.borrow_mut
();
...
...
@@ -149,10 +149,10 @@ fn fix_scalar_builtin_expr(&mut self, e: &hir::Expr) {
hir
::
ExprKind
::
Binary
(
ref
op
,
ref
lhs
,
ref
rhs
)
|
hir
::
ExprKind
::
AssignOp
(
ref
op
,
ref
lhs
,
ref
rhs
)
=>
{
let
lhs_ty
=
self
.fcx
.node_ty
(
lhs
.hir_id
);
let
lhs_ty
=
self
.fcx
.resolve_
type_
vars_if_possible
(
&
lhs_ty
);
let
lhs_ty
=
self
.fcx
.resolve_vars_if_possible
(
&
lhs_ty
);
let
rhs_ty
=
self
.fcx
.node_ty
(
rhs
.hir_id
);
let
rhs_ty
=
self
.fcx
.resolve_
type_
vars_if_possible
(
&
rhs_ty
);
let
rhs_ty
=
self
.fcx
.resolve_vars_if_possible
(
&
rhs_ty
);
if
lhs_ty
.is_scalar
()
&&
rhs_ty
.is_scalar
()
{
let
mut
tables
=
self
.fcx.tables
.borrow_mut
();
...
...
@@ -192,7 +192,7 @@ fn fix_index_builtin_expr(&mut self, e: &hir::Expr) {
// All valid indexing looks like this; might encounter non-valid indexes at this point
if
let
ty
::
Ref
(
_
,
base_ty
,
_
)
=
tables
.expr_ty_adjusted
(
&
base
)
.sty
{
let
index_ty
=
tables
.expr_ty_adjusted
(
&
index
);
let
index_ty
=
self
.fcx
.resolve_
type_
vars_if_possible
(
&
index_ty
);
let
index_ty
=
self
.fcx
.resolve_vars_if_possible
(
&
index_ty
);
if
base_ty
.builtin_index
()
.is_some
()
&&
index_ty
==
self
.fcx.tcx.types.usize
{
// Remove the method call record
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录