Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
beab6ba8
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,发现更多精彩内容 >>
提交
beab6ba8
编写于
7月 25, 2011
作者:
M
Marijn Haverbeke
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add a pass that checks for unreachable alt arms
上级
bd81adab
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
115 addition
and
2 deletion
+115
-2
src/comp/driver/rustc.rs
src/comp/driver/rustc.rs
+2
-0
src/comp/middle/check_alt.rs
src/comp/middle/check_alt.rs
+102
-0
src/comp/middle/ty.rs
src/comp/middle/ty.rs
+0
-2
src/comp/rustc.rc
src/comp/rustc.rc
+1
-0
src/test/compile-fail/unreachable-arm.rs
src/test/compile-fail/unreachable-arm.rs
+10
-0
未找到文件。
src/comp/driver/rustc.rs
浏览文件 @
beab6ba8
...
...
@@ -138,6 +138,8 @@ fn compile_input(session::session sess, ast::crate_cfg cfg, str input,
auto
ty_cx
=
ty
::
mk_ctxt
(
sess
,
d
,
ast_map
,
freevars
);
time
[()](
time_passes
,
"typechecking"
,
bind
typeck
::
check_crate
(
ty_cx
,
crate
));
time
[()](
time_passes
,
"alt checking"
,
bind
middle
::
check_alt
::
check_crate
(
ty_cx
,
crate
));
if
(
sess
.get_opts
()
.run_typestate
)
{
time
(
time_passes
,
"typestate checking"
,
bind
middle
::
tstate
::
ck
::
check_crate
(
ty_cx
,
crate
));
...
...
src/comp/middle/check_alt.rs
0 → 100644
浏览文件 @
beab6ba8
import
syntax
::
ast
::
*
;
import
syntax
::
visit
;
fn
check_crate
(
&
ty
::
ctxt
tcx
,
&@
crate
crate
)
{
auto
v
=
@
rec
(
visit_expr
=
bind
check_expr
(
tcx
,
_
,
_
,
_
)
with
*
visit
::
default_visitor
[()]());
visit
::
visit_crate
(
*
crate
,
(),
visit
::
mk_vt
(
v
));
tcx
.sess
.abort_if_errors
();
}
fn
check_expr
(
&
ty
::
ctxt
tcx
,
&@
expr
ex
,
&
()
s
,
&
visit
::
vt
[()]
v
)
{
visit
::
visit_expr
(
ex
,
s
,
v
);
alt
ex
.node
{
expr_alt
(
_
,
?
arms
)
{
check_arms
(
tcx
,
arms
);
}
_
{}
}
}
fn
check_arms
(
&
ty
::
ctxt
tcx
,
&
arm
[]
arms
)
{
auto
i
=
0
;
for
(
arm
arm
in
arms
)
{
for
(
@
pat
arm_pat
in
arm
.pats
)
{
auto
reachable
=
true
;
auto
j
=
0
;
while
j
<
i
{
for
(
@
pat
prev_pat
in
arms
.
(
j
)
.pats
)
{
if
pattern_supersedes
(
tcx
,
prev_pat
,
arm_pat
)
{
reachable
=
false
;
}
}
j
+=
1
;
}
if
!
reachable
{
tcx
.sess
.span_err
(
arm_pat
.span
,
"unreachable pattern"
);
}
}
i
+=
1
;
}
}
fn
pattern_supersedes
(
&
ty
::
ctxt
tcx
,
&@
pat
a
,
&@
pat
b
)
->
bool
{
fn
patterns_supersede
(
&
ty
::
ctxt
tcx
,
&
(
@
pat
)[]
as
,
&
(
@
pat
)[]
bs
)
->
bool
{
auto
i
=
0
;
for
(
@
pat
a
in
as
)
{
if
!
pattern_supersedes
(
tcx
,
a
,
bs
.
(
i
))
{
ret
false
;
}
i
+=
1
;
}
ret
true
;
}
fn
field_patterns_supersede
(
&
ty
::
ctxt
tcx
,
&
field_pat
[]
fas
,
&
field_pat
[]
fbs
)
->
bool
{
auto
wild
=
@
rec
(
id
=
0
,
node
=
pat_wild
,
span
=
rec
(
lo
=
0u
,
hi
=
0u
));
for
(
field_pat
fa
in
fas
)
{
auto
pb
=
wild
;
for
(
field_pat
fb
in
fbs
)
{
if
fa
.ident
==
fb
.ident
{
pb
=
fb
.pat
;
}
}
if
!
pattern_supersedes
(
tcx
,
fa
.pat
,
pb
)
{
ret
false
;
}
}
ret
true
;
}
alt
a
.node
{
pat_wild
|
pat_bind
(
_
)
{
ret
true
;
}
pat_lit
(
?
la
)
{
alt
b
.node
{
pat_lit
(
?
lb
)
{
ret
util
::
common
::
lit_eq
(
la
,
lb
);
}
_
{
ret
false
;
}
}
}
pat_tag
(
?
va
,
?
suba
)
{
alt
b
.node
{
pat_tag
(
?
vb
,
?
subb
)
{
ret
tcx
.def_map
.get
(
a
.id
)
==
tcx
.def_map
.get
(
b
.id
)
&&
patterns_supersede
(
tcx
,
suba
,
subb
);
}
_
{
ret
false
;
}
}
}
pat_rec
(
?
suba
,
_
)
{
alt
b
.node
{
pat_rec
(
?
subb
,
_
)
{
ret
field_patterns_supersede
(
tcx
,
suba
,
subb
);
}
_
{
ret
false
;
}
}
}
pat_box
(
?
suba
)
{
alt
b
.node
{
pat_box
(
?
subb
)
{
ret
pattern_supersedes
(
tcx
,
suba
,
subb
);
}
_
{
ret
pattern_supersedes
(
tcx
,
suba
,
b
);
}
}
}
}
}
// Local Variables:
// mode: rust
// fill-column: 78;
// indent-tabs-mode: nil
// c-basic-offset: 4
// buffer-file-coding-system: utf-8-unix
// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
// End:
src/comp/middle/ty.rs
浏览文件 @
beab6ba8
...
...
@@ -1254,8 +1254,6 @@ fn type_owns_heap_mem(&ctxt cx, &t ty) -> bool {
case
(
ty_port
(
_
))
{
result
=
false
;
}
case
(
ty_chan
(
_
))
{
result
=
false
;
}
case
(
ty_task
)
{
result
=
false
;
}
case
(
ty_tup
(
_
))
{
result
=
false
;
}
case
(
ty_rec
(
_
))
{
result
=
false
;
}
case
(
ty_var
(
_
))
{
fail
"ty_var in type_owns_heap_mem"
;
}
case
(
ty_param
(
_
))
{
result
=
false
;
}
}
...
...
src/comp/rustc.rc
浏览文件 @
beab6ba8
...
...
@@ -25,6 +25,7 @@ mod middle {
mod
ast_map
;
mod
resolve
;
mod
typeck
;
mod
check_alt
;
mod
alias
;
mod
freevars
;
...
...
src/test/compile-fail/unreachable-arm.rs
0 → 100644
浏览文件 @
beab6ba8
// error-pattern:unreachable pattern
tag
foo
{
a
(
@
foo
,
int
);
b
(
uint
);
}
fn
main
()
{
alt
b
(
1u
)
{
b
(
_
)
|
a
(
@
_
,
1
)
{}
a
(
_
,
1
)
{}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录