Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
923616e1
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,发现更多精彩内容 >>
提交
923616e1
编写于
2月 20, 2015
作者:
E
Eduard Burtescu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix @nikomatsakis' nits in typeck.
上级
09ad993a
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
27 addition
and
36 deletion
+27
-36
src/librustc_typeck/astconv.rs
src/librustc_typeck/astconv.rs
+10
-4
src/librustc_typeck/check/mod.rs
src/librustc_typeck/check/mod.rs
+14
-25
src/librustc_typeck/lib.rs
src/librustc_typeck/lib.rs
+3
-7
未找到文件。
src/librustc_typeck/astconv.rs
浏览文件 @
923616e1
...
...
@@ -622,7 +622,7 @@ pub fn instantiate_trait_ref<'tcx>(
->
Rc
<
ty
::
TraitRef
<
'tcx
>>
{
let
path
=
&
trait_ref
.path
;
match
::
lookup_
def_tcx
(
this
.tcx
(),
path
.span
,
trait_ref
.ref_id
)
{
match
::
lookup_
full_def
(
this
.tcx
(),
path
.span
,
trait_ref
.ref_id
)
{
def
::
DefTrait
(
trait_def_id
)
=>
{
let
trait_ref
=
ast_path_to_trait_ref
(
this
,
rscope
,
...
...
@@ -899,7 +899,10 @@ fn ast_ty_to_trait_ref<'tcx>(this: &AstConv<'tcx>,
match
ty
.node
{
ast
::
TyPath
(
None
,
ref
path
)
=>
{
let
def
=
this
.tcx
()
.def_map
.borrow
()
.get
(
&
ty
.id
)
.map
(|
d
|
d
.full_def
());
let
def
=
match
this
.tcx
()
.def_map
.borrow
()
.get
(
&
ty
.id
)
{
Some
(
&
def
::
PathResolution
{
base_def
,
depth
:
0
,
..
})
=>
Some
(
base_def
),
_
=>
None
};
match
def
{
Some
(
def
::
DefTrait
(
trait_def_id
))
=>
{
let
mut
projection_bounds
=
Vec
::
new
();
...
...
@@ -1202,7 +1205,10 @@ pub fn finish_resolving_def_to_ty<'tcx>(this: &AstConv<'tcx>,
segments
.last
()
.unwrap
())
}
def
::
DefMod
(
id
)
=>
{
// Used as sentinel by callers to indicate the `<T>::a::b::c` form.
// Used as sentinel by callers to indicate the `<T>::A::B::C` form.
// FIXME(#22519) This part of the resolution logic should be
// avoided entirely for that form, once we stop needed a Def
// for `associated_path_def_to_ty`.
if
segments
.is_empty
()
{
opt_self_ty
.expect
(
"missing T in <T>::a::b::c"
)
}
else
{
...
...
@@ -1890,7 +1896,7 @@ pub fn partition_bounds<'a>(tcx: &ty::ctxt,
for
ast_bound
in
ast_bounds
{
match
*
ast_bound
{
ast
::
TraitTyParamBound
(
ref
b
,
ast
::
TraitBoundModifier
::
None
)
=>
{
match
::
lookup_
def_tcx
(
tcx
,
b
.trait_ref.path.span
,
b
.trait_ref.ref_id
)
{
match
::
lookup_
full_def
(
tcx
,
b
.trait_ref.path.span
,
b
.trait_ref.ref_id
)
{
def
::
DefTrait
(
trait_did
)
=>
{
match
trait_def_ids
.get
(
&
trait_did
)
{
// Already seen this trait. We forbid
...
...
src/librustc_typeck/check/mod.rs
浏览文件 @
923616e1
...
...
@@ -103,7 +103,7 @@
use
middle
::
ty_fold
::{
TypeFolder
,
TypeFoldable
};
use
rscope
::
RegionScope
;
use
session
::
Session
;
use
{
CrateCtxt
,
lookup_
def_ccx
,
require_same_types
};
use
{
CrateCtxt
,
lookup_
full_def
,
require_same_types
};
use
TypeAndSubsts
;
use
lint
;
use
util
::
common
::{
block_query
,
indenter
,
loop_query
};
...
...
@@ -3401,7 +3401,7 @@ fn check_struct_fields_on_error<'a,'tcx>(fcx: &FnCtxt<'a,'tcx>,
ast
::
ExprPath
(
None
,
ref
path
)
=>
{
// FIXME(pcwalton): For now we hardcode the two permissible
// places: the exchange heap and the managed heap.
let
definition
=
lookup_
def
(
f
cx
,
path
.span
,
place
.id
);
let
definition
=
lookup_
full_def
(
t
cx
,
path
.span
,
place
.id
);
let
def_id
=
definition
.def_id
();
let
referent_ty
=
fcx
.expr_ty
(
&**
subexpr
);
if
tcx
.lang_items
.exchange_heap
()
==
Some
(
def_id
)
{
...
...
@@ -3884,14 +3884,14 @@ fn check_struct_fields_on_error<'a,'tcx>(fcx: &FnCtxt<'a,'tcx>,
}
ast
::
ExprStruct
(
ref
path
,
ref
fields
,
ref
base_expr
)
=>
{
// Resolve the path.
let
def
=
tcx
.def_map
.borrow
()
.get
(
&
id
)
.map
(|
d
|
d
.full_def
()
);
let
def
=
lookup_full_def
(
tcx
,
path
.span
,
id
);
let
struct_id
=
match
def
{
Some
(
def
::
DefVariant
(
enum_id
,
variant_id
,
true
)
)
=>
{
def
::
DefVariant
(
enum_id
,
variant_id
,
true
)
=>
{
check_struct_enum_variant
(
fcx
,
id
,
expr
.span
,
enum_id
,
variant_id
,
&
fields
[
..
]);
enum_id
}
Some
(
def
::
DefTrait
(
def_id
)
)
=>
{
def
::
DefTrait
(
def_id
)
=>
{
span_err!
(
tcx
.sess
,
path
.span
,
E0159
,
"use of trait `{}` as a struct constructor"
,
pprust
::
path_to_string
(
path
));
...
...
@@ -3901,7 +3901,7 @@ fn check_struct_fields_on_error<'a,'tcx>(fcx: &FnCtxt<'a,'tcx>,
base_expr
);
def_id
},
Some
(
def
)
=>
{
def
=>
{
// Verify that this was actually a struct.
let
typ
=
ty
::
lookup_item_type
(
fcx
.ccx.tcx
,
def
.def_id
());
match
typ
.ty.sty
{
...
...
@@ -3926,10 +3926,6 @@ fn check_struct_fields_on_error<'a,'tcx>(fcx: &FnCtxt<'a,'tcx>,
def
.def_id
()
}
_
=>
{
tcx
.sess
.span_bug
(
path
.span
,
"structure constructor wasn't resolved"
)
}
};
// Turn the path into a type and verify that that type unifies with
...
...
@@ -4643,10 +4639,6 @@ fn do_check<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
check_instantiable
(
ccx
.tcx
,
sp
,
id
);
}
pub
fn
lookup_def
(
fcx
:
&
FnCtxt
,
sp
:
Span
,
id
:
ast
::
NodeId
)
->
def
::
Def
{
lookup_def_ccx
(
fcx
.ccx
,
sp
,
id
)
}
// Returns the type parameter count and the type for the given definition.
fn
type_scheme_and_predicates_for_def
<
'a
,
'tcx
>
(
fcx
:
&
FnCtxt
<
'a
,
'tcx
>
,
sp
:
Span
,
...
...
@@ -5171,18 +5163,15 @@ pub fn may_break(cx: &ty::ctxt, id: ast::NodeId, b: &ast::Block) -> bool {
_
=>
false
}
}))
||
// Second: is there a labeled break with label
// <id> nested anywhere inside the loop?
// Second: is there a labeled break with label
// <id> nested anywhere inside the loop?
(
block_query
(
b
,
|
e
|
{
match
e
.node
{
ast
::
ExprBreak
(
Some
(
_
))
=>
{
match
cx
.def_map
.borrow
()
.get
(
&
e
.id
)
.map
(|
d
|
d
.full_def
())
{
Some
(
def
::
DefLabel
(
loop_id
))
if
id
==
loop_id
=>
true
,
_
=>
false
,
}
}
_
=>
false
}}))
if
let
ast
::
ExprBreak
(
Some
(
_
))
=
e
.node
{
lookup_full_def
(
cx
,
e
.span
,
e
.id
)
==
def
::
DefLabel
(
id
)
}
else
{
false
}
}))
}
pub
fn
check_bounds_are_used
<
'a
,
'tcx
>
(
ccx
:
&
CrateCtxt
<
'a
,
'tcx
>
,
...
...
src/librustc_typeck/lib.rs
浏览文件 @
923616e1
...
...
@@ -163,20 +163,16 @@ fn write_substs_to_tcx<'tcx>(tcx: &ty::ctxt<'tcx>,
tcx
.item_substs
.borrow_mut
()
.insert
(
node_id
,
item_substs
);
}
}
fn
lookup_def_tcx
(
tcx
:
&
ty
::
ctxt
,
sp
:
Span
,
id
:
ast
::
NodeId
)
->
def
::
Def
{
fn
lookup_full_def
(
tcx
:
&
ty
::
ctxt
,
sp
:
Span
,
id
:
ast
::
NodeId
)
->
def
::
Def
{
match
tcx
.def_map
.borrow
()
.get
(
&
id
)
{
Some
(
x
)
=>
x
.full_def
(),
_
=>
{
None
=>
{
span_fatal!
(
tcx
.sess
,
sp
,
E0242
,
"internal error looking up a definition"
)
}
}
}
fn
lookup_def_ccx
(
ccx
:
&
CrateCtxt
,
sp
:
Span
,
id
:
ast
::
NodeId
)
->
def
::
Def
{
lookup_def_tcx
(
ccx
.tcx
,
sp
,
id
)
}
fn
require_same_types
<
'a
,
'tcx
,
M
>
(
tcx
:
&
ty
::
ctxt
<
'tcx
>
,
maybe_infcx
:
Option
<&
infer
::
InferCtxt
<
'a
,
'tcx
>>
,
t1_is_expected
:
bool
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录