Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
a32463ad
R
Rust
项目概览
int
/
Rust
接近 1 年 前同步成功
通知
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,发现更多精彩内容 >>
提交
a32463ad
编写于
5月 11, 2020
作者:
J
Jonas Schievink
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make MIR typeck use `LocalDefId` and fix docs
上级
9912925c
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
50 addition
and
54 deletion
+50
-54
src/librustc_mir/borrow_check/mod.rs
src/librustc_mir/borrow_check/mod.rs
+1
-1
src/librustc_mir/borrow_check/nll.rs
src/librustc_mir/borrow_check/nll.rs
+4
-4
src/librustc_mir/borrow_check/type_check/input_output.rs
src/librustc_mir/borrow_check/type_check/input_output.rs
+29
-27
src/librustc_mir/borrow_check/type_check/mod.rs
src/librustc_mir/borrow_check/type_check/mod.rs
+16
-22
未找到文件。
src/librustc_mir/borrow_check/mod.rs
浏览文件 @
a32463ad
...
...
@@ -209,7 +209,7 @@ fn do_mir_borrowck<'a, 'tcx>(
nll_errors
,
}
=
nll
::
compute_regions
(
infcx
,
def_id
.to_def_id
()
,
def_id
,
free_regions
,
body
,
&
promoted
,
...
...
src/librustc_mir/borrow_check/nll.rs
浏览文件 @
a32463ad
...
...
@@ -2,7 +2,7 @@
use
rustc_data_structures
::
fx
::
FxHashMap
;
use
rustc_errors
::
Diagnostic
;
use
rustc_hir
::
def_id
::
DefId
;
use
rustc_hir
::
def_id
::
{
DefId
,
LocalDefId
}
;
use
rustc_index
::
vec
::
IndexVec
;
use
rustc_infer
::
infer
::
InferCtxt
;
use
rustc_middle
::
mir
::{
...
...
@@ -157,7 +157,7 @@ fn populate_polonius_move_facts(
/// This may result in errors being reported.
pub
(
in
crate
::
borrow_check
)
fn
compute_regions
<
'cx
,
'tcx
>
(
infcx
:
&
InferCtxt
<
'cx
,
'tcx
>
,
def_id
:
DefId
,
def_id
:
Local
DefId
,
universal_regions
:
UniversalRegions
<
'tcx
>
,
body
:
&
Body
<
'tcx
>
,
promoted
:
&
IndexVec
<
Promoted
,
Body
<
'tcx
>>
,
...
...
@@ -272,7 +272,7 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>(
// Dump facts if requested.
let
polonius_output
=
all_facts
.and_then
(|
all_facts
|
{
if
infcx
.tcx.sess.opts.debugging_opts.nll_facts
{
let
def_path
=
infcx
.tcx
.def_path
(
def_id
);
let
def_path
=
infcx
.tcx
.def_path
(
def_id
.to_def_id
()
);
let
dir_path
=
PathBuf
::
from
(
"nll-facts"
)
.join
(
def_path
.to_filename_friendly_no_crate
());
all_facts
.write_to_dir
(
dir_path
,
location_table
)
.unwrap
();
...
...
@@ -292,7 +292,7 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>(
// Solve the region constraints.
let
(
closure_region_requirements
,
nll_errors
)
=
regioncx
.solve
(
infcx
,
&
body
,
def_id
,
polonius_output
.clone
());
regioncx
.solve
(
infcx
,
&
body
,
def_id
.to_def_id
()
,
polonius_output
.clone
());
if
!
nll_errors
.is_empty
()
{
// Suppress unhelpful extra errors in `infer_opaque_types`.
...
...
src/librustc_mir/borrow_check/type_check/input_output.rs
浏览文件 @
a32463ad
...
...
@@ -33,35 +33,37 @@ pub(super) fn equate_inputs_and_outputs(
//
// e.g., `|x: FxHashMap<_, &'static u32>| ...`
let
user_provided_sig
;
if
!
self
.tcx
()
.is_closure
(
self
.mir_def_id
)
{
if
!
self
.tcx
()
.is_closure
(
self
.mir_def_id
.to_def_id
()
)
{
user_provided_sig
=
None
;
}
else
{
let
typeck_tables
=
self
.tcx
()
.typeck_tables_of
(
self
.mir_def_id
.expect_local
());
user_provided_sig
=
match
typeck_tables
.user_provided_sigs
.get
(
&
self
.mir_def_id
)
{
None
=>
None
,
Some
(
user_provided_poly_sig
)
=>
{
// Instantiate the canonicalized variables from
// user-provided signature (e.g., the `_` in the code
// above) with fresh variables.
let
(
poly_sig
,
_
)
=
self
.infcx
.instantiate_canonical_with_fresh_inference_vars
(
body
.span
,
&
user_provided_poly_sig
,
);
// Replace the bound items in the fn sig with fresh
// variables, so that they represent the view from
// "inside" the closure.
Some
(
self
.infcx
.replace_bound_vars_with_fresh_vars
(
let
typeck_tables
=
self
.tcx
()
.typeck_tables_of
(
self
.mir_def_id
);
user_provided_sig
=
match
typeck_tables
.user_provided_sigs
.get
(
&
self
.mir_def_id
.to_def_id
())
{
None
=>
None
,
Some
(
user_provided_poly_sig
)
=>
{
// Instantiate the canonicalized variables from
// user-provided signature (e.g., the `_` in the code
// above) with fresh variables.
let
(
poly_sig
,
_
)
=
self
.infcx
.instantiate_canonical_with_fresh_inference_vars
(
body
.span
,
LateBoundRegionConversionTime
::
FnCall
,
&
poly_sig
,
)
.0
,
)
&
user_provided_poly_sig
,
);
// Replace the bound items in the fn sig with fresh
// variables, so that they represent the view from
// "inside" the closure.
Some
(
self
.infcx
.replace_bound_vars_with_fresh_vars
(
body
.span
,
LateBoundRegionConversionTime
::
FnCall
,
&
poly_sig
,
)
.0
,
)
}
}
}
};
debug!
(
...
...
@@ -120,7 +122,7 @@ pub(super) fn equate_inputs_and_outputs(
if
let
Err
(
terr
)
=
self
.eq_opaque_type_and_type
(
mir_output_ty
,
normalized_output_ty
,
self
.mir_def_id
,
self
.mir_def_id
.to_def_id
()
,
Locations
::
All
(
output_span
),
ConstraintCategory
::
BoringNoLocation
,
)
{
...
...
@@ -143,7 +145,7 @@ pub(super) fn equate_inputs_and_outputs(
if
let
Err
(
err
)
=
self
.eq_opaque_type_and_type
(
mir_output_ty
,
user_provided_output_ty
,
self
.mir_def_id
,
self
.mir_def_id
.to_def_id
()
,
Locations
::
All
(
output_span
),
ConstraintCategory
::
BoringNoLocation
,
)
{
...
...
src/librustc_mir/borrow_check/type_check/mod.rs
浏览文件 @
a32463ad
...
...
@@ -108,26 +108,22 @@
///
/// - `infcx` -- inference context to use
/// - `param_env` -- parameter environment to use for trait solving
/// - `mir` -- MIR to type-check
/// - `mir_def_id` -- DefId from which the MIR is derived (must be local)
/// - `region_bound_pairs` -- the implied outlives obligations between type parameters
/// and lifetimes (e.g., `&'a T` implies `T: 'a`)
/// - `implicit_region_bound` -- a region which all generic parameters are assumed
/// to outlive; should represent the fn body
/// - `input_tys` -- fully liberated, but **not** normalized, expected types of the arguments;
/// the types of the input parameters found in the MIR itself will be equated with these
/// - `output_ty` -- fully liberated, but **not** normalized, expected return type;
/// the type for the RETURN_PLACE will be equated with this
/// - `liveness` -- results of a liveness computation on the MIR; used to create liveness
/// constraints for the regions in the types of variables
/// - `body` -- MIR body to type-check
/// - `promoted` -- map of promoted constants within `body`
/// - `mir_def_id` -- `LocalDefId` from which the MIR is derived
/// - `universal_regions` -- the universal regions from `body`s function signature
/// - `location_table` -- MIR location map of `body`
/// - `borrow_set` -- information about borrows occurring in `body`
/// - `all_facts` -- when using Polonius, this is the generated set of Polonius facts
/// - `flow_inits` -- results of a maybe-init dataflow analysis
/// - `move_data` -- move-data constructed when performing the maybe-init dataflow analysis
/// - `elements` -- MIR region map
pub
(
crate
)
fn
type_check
<
'mir
,
'tcx
>
(
infcx
:
&
InferCtxt
<
'_
,
'tcx
>
,
param_env
:
ty
::
ParamEnv
<
'tcx
>
,
body
:
&
Body
<
'tcx
>
,
promoted
:
&
IndexVec
<
Promoted
,
Body
<
'tcx
>>
,
mir_def_id
:
DefId
,
mir_def_id
:
Local
DefId
,
universal_regions
:
&
Rc
<
UniversalRegions
<
'tcx
>>
,
location_table
:
&
LocationTable
,
borrow_set
:
&
BorrowSet
<
'tcx
>
,
...
...
@@ -191,7 +187,7 @@ pub(crate) fn type_check<'mir, 'tcx>(
fn
type_check_internal
<
'a
,
'tcx
,
R
>
(
infcx
:
&
'a
InferCtxt
<
'a
,
'tcx
>
,
mir_def_id
:
DefId
,
mir_def_id
:
Local
DefId
,
param_env
:
ty
::
ParamEnv
<
'tcx
>
,
body
:
&
'a
Body
<
'tcx
>
,
promoted
:
&
'a
IndexVec
<
Promoted
,
Body
<
'tcx
>>
,
...
...
@@ -271,7 +267,7 @@ struct TypeVerifier<'a, 'b, 'tcx> {
body
:
&
'b
Body
<
'tcx
>
,
promoted
:
&
'b
IndexVec
<
Promoted
,
Body
<
'tcx
>>
,
last_span
:
Span
,
mir_def_id
:
DefId
,
mir_def_id
:
Local
DefId
,
errors_reported
:
bool
,
}
...
...
@@ -815,7 +811,7 @@ struct TypeChecker<'a, 'tcx> {
/// User type annotations are shared between the main MIR and the MIR of
/// all of the promoted items.
user_type_annotations
:
&
'a
CanonicalUserTypeAnnotations
<
'tcx
>
,
mir_def_id
:
DefId
,
mir_def_id
:
Local
DefId
,
region_bound_pairs
:
&
'a
RegionBoundPairs
<
'tcx
>
,
implicit_region_bound
:
ty
::
Region
<
'tcx
>
,
reported_errors
:
FxHashSet
<
(
Ty
<
'tcx
>
,
Span
)
>
,
...
...
@@ -963,7 +959,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
fn
new
(
infcx
:
&
'a
InferCtxt
<
'a
,
'tcx
>
,
body
:
&
'a
Body
<
'tcx
>
,
mir_def_id
:
DefId
,
mir_def_id
:
Local
DefId
,
param_env
:
ty
::
ParamEnv
<
'tcx
>
,
region_bound_pairs
:
&
'a
RegionBoundPairs
<
'tcx
>
,
implicit_region_bound
:
ty
::
Region
<
'tcx
>
,
...
...
@@ -1142,7 +1138,7 @@ fn sub_types_or_anon(
// When you have `let x: impl Foo = ...` in a closure,
// the resulting inferend values are stored with the
// def-id of the base function.
let
parent_def_id
=
self
.tcx
()
.closure_base_def_id
(
self
.mir_def_id
);
let
parent_def_id
=
self
.tcx
()
.closure_base_def_id
(
self
.mir_def_id
.to_def_id
()
);
return
self
.eq_opaque_type_and_type
(
sub
,
sup
,
parent_def_id
,
locations
,
category
);
}
else
{
return
Err
(
terr
);
...
...
@@ -1994,7 +1990,7 @@ fn check_rvalue(&mut self, body: &Body<'tcx>, rvalue: &Rvalue<'tcx>, location: L
if
!
self
.infcx
.type_is_copy_modulo_regions
(
self
.param_env
,
ty
,
span
)
{
let
ccx
=
ConstCx
::
new_with_param_env
(
tcx
,
self
.mir_def_id
.expect_local
()
,
self
.mir_def_id
,
body
,
self
.param_env
,
);
...
...
@@ -2010,9 +2006,7 @@ fn check_rvalue(&mut self, body: &Body<'tcx>, rvalue: &Rvalue<'tcx>, location: L
&
traits
::
Obligation
::
new
(
ObligationCause
::
new
(
span
,
self
.tcx
()
.hir
()
.local_def_id_to_hir_id
(
self
.mir_def_id
.expect_local
()),
self
.tcx
()
.hir
()
.local_def_id_to_hir_id
(
self
.mir_def_id
),
traits
::
ObligationCauseCode
::
RepeatVec
(
should_suggest
),
),
self
.param_env
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录