Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
c8ab0c1b
R
Rust
项目概览
int
/
Rust
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
c8ab0c1b
编写于
3月 21, 2012
作者:
P
Patrick Walton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rustc: Replace region parameters in function return values
上级
324f57a1
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
35 addition
and
9 deletion
+35
-9
src/rustc/middle/typeck.rs
src/rustc/middle/typeck.rs
+35
-9
未找到文件。
src/rustc/middle/typeck.rs
浏览文件 @
c8ab0c1b
...
...
@@ -16,6 +16,7 @@
import
std
::
smallintmap
;
import
std
::
map
::{
hashmap
,
int_hash
};
import
std
::
serialization
::{
serialize_uint
,
deserialize_uint
};
import
std
::
ufind
;
import
syntax
::
print
::
pprust
::
*
;
export
check_crate
;
...
...
@@ -1554,6 +1555,33 @@ fn universally_quantify_regions(tcx: ty::ctxt, ty: ty::t) -> ty::t {
}
}
// Replaces region parameter types in the given type with the appropriate
// bindings.
fn
replace_region_params
(
tcx
:
ty
::
ctxt
,
sp
:
span
,
rb
:
@
ty
::
unify
::
region_bindings
,
ty
:
ty
::
t
)
->
ty
::
t
{
if
ty
::
type_has_rptrs
(
ty
)
{
ty
::
fold_ty
(
tcx
,
ty
::
fm_rptr
({
|
r
|
alt
r
{
ty
::
re_param
(
n
)
{
if
n
<
ufind
::
set_count
(
rb
.sets
)
{
smallintmap
::
get
(
rb
.regions
,
ufind
::
find
(
rb
.sets
,
n
))
}
else
{
tcx
.sess
.span_err
(
sp
,
"unresolved region"
);
r
}
}
_
{
r
}
}
}),
ty
)
}
else
{
ty
}
}
fn
check_pat_variant
(
pcx
:
pat_ctxt
,
pat
:
@
ast
::
pat
,
path
:
@
ast
::
path
,
subpats
:
[
@
ast
::
pat
],
expected
:
ty
::
t
)
{
// Typecheck the path.
...
...
@@ -2277,40 +2305,38 @@ fn check_assignment(fcx: @fn_ctxt, _sp: span, lhs: @ast::expr,
// A generic function for checking call expressions
fn
check_call
(
fcx
:
@
fn_ctxt
,
sp
:
span
,
id
:
ast
::
node_id
,
f
:
@
ast
::
expr
,
args
:
[
@
ast
::
expr
])
->
bool
{
->
check_call_or_bind_result
{
let
args_opt_0
:
[
option
<@
ast
::
expr
>
]
=
[];
for
arg
:
@
ast
::
expr
in
args
{
args_opt_0
+=
[
some
::
<@
ast
::
expr
>
(
arg
)];
}
let
mut
bot
=
check_expr
(
fcx
,
f
);
let
bot
=
check_expr
(
fcx
,
f
);
// Call the generic checker.
let
ccobr
=
check_call_or_bind
(
fcx
,
sp
,
id
,
expr_ty
(
fcx
.ccx.tcx
,
f
),
args_opt_0
);
bot
|
=
ccobr
.bot
;
// TODO: Munge return type.
ret
bot
;
ret
{
bot
:
bot
|
ccobr
.bot
with
ccobr
};
}
// A generic function for doing all of the checking for call expressions
fn
check_call_full
(
fcx
:
@
fn_ctxt
,
sp
:
span
,
id
:
ast
::
node_id
,
f
:
@
ast
::
expr
,
args
:
[
@
ast
::
expr
])
->
bool
{
let
bot
=
check_call
(
fcx
,
sp
,
id
,
f
,
args
);
let
ccobr
=
check_call
(
fcx
,
sp
,
id
,
f
,
args
);
let
mut
bot
=
ccobr
.bot
;
/* need to restrict oper to being an explicit expr_path if we're
inside a pure function */
require_pure_call
(
fcx
.ccx
,
fcx
.purity
,
f
,
sp
);
// Pull the return type out of the type of the function.
let
fty
=
ty
::
expr_ty
(
fcx
.ccx.tcx
,
f
);
let
rt_1
=
alt
structure_of
(
fcx
,
sp
,
fty
)
{
let
mut
rt_1
=
alt
structure_of
(
fcx
,
sp
,
fty
)
{
ty
::
ty_fn
(
f
)
{
bot
|
=
f
.ret_style
==
ast
::
noreturn
;
f
.output
}
_
{
fcx
.ccx.tcx.sess
.span_fatal
(
sp
,
"calling non-function"
);
}
};
rt_1
=
replace_region_params
(
fcx
.ccx.tcx
,
f
.span
,
ccobr
.rb
,
rt_1
);
write_ty
(
fcx
.ccx.tcx
,
id
,
rt_1
);
ret
bot
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录