Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
7ad1c62d
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,发现更多精彩内容 >>
提交
7ad1c62d
编写于
7月 01, 2018
作者:
V
varkor
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix an ICE using break and continue as array lengths
上级
c6bbee80
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
60 addition
and
6 deletion
+60
-6
src/librustc_driver/driver.rs
src/librustc_driver/driver.rs
+1
-0
src/librustc_mir/build/scope.rs
src/librustc_mir/build/scope.rs
+3
-3
src/librustc_passes/loops.rs
src/librustc_passes/loops.rs
+6
-1
src/test/ui/array-break-length.rs
src/test/ui/array-break-length.rs
+19
-0
src/test/ui/array-break-length.stderr
src/test/ui/array-break-length.stderr
+15
-0
src/test/ui/closure-array-break-length.rs
src/test/ui/closure-array-break-length.rs
+2
-0
src/test/ui/closure-array-break-length.stderr
src/test/ui/closure-array-break-length.stderr
+14
-2
未找到文件。
src/librustc_driver/driver.rs
浏览文件 @
7ad1c62d
...
...
@@ -1211,6 +1211,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(
.set
(
derive_registrar
::
find
(
&
hir_map
));
time
(
sess
,
"loop checking"
,
||
loops
::
check_crate
(
sess
,
&
hir_map
));
sess
.abort_if_errors
();
let
mut
local_providers
=
ty
::
query
::
Providers
::
default
();
default_provide
(
&
mut
local_providers
);
...
...
src/librustc_mir/build/scope.rs
浏览文件 @
7ad1c62d
...
...
@@ -541,9 +541,9 @@ pub fn new_source_scope(&mut self,
/// Finds the breakable scope for a given label. This is used for
/// resolving `break` and `continue`.
pub
fn
find_breakable_scope
(
&
self
,
span
:
Span
,
label
:
region
::
Scope
)
->
&
BreakableScope
<
'tcx
>
{
span
:
Span
,
label
:
region
::
Scope
)
->
&
BreakableScope
<
'tcx
>
{
// find the loop-scope with the correct id
self
.breakable_scopes
.iter
()
.rev
()
...
...
src/librustc_passes/loops.rs
浏览文件 @
7ad1c62d
...
...
@@ -40,6 +40,7 @@ enum Context {
Loop
(
LoopKind
),
Closure
,
LabeledBlock
,
AnonConst
,
}
#[derive(Copy,
Clone)]
...
...
@@ -71,6 +72,10 @@ fn visit_impl_item(&mut self, i: &'hir hir::ImplItem) {
self
.with_context
(
Normal
,
|
v
|
intravisit
::
walk_impl_item
(
v
,
i
));
}
fn
visit_anon_const
(
&
mut
self
,
c
:
&
'hir
hir
::
AnonConst
)
{
self
.with_context
(
AnonConst
,
|
v
|
intravisit
::
walk_anon_const
(
v
,
c
));
}
fn
visit_expr
(
&
mut
self
,
e
:
&
'hir
hir
::
Expr
)
{
match
e
.node
{
hir
::
ExprWhile
(
ref
e
,
ref
b
,
_
)
=>
{
...
...
@@ -194,7 +199,7 @@ fn require_break_cx(&self, name: &str, span: Span) {
.span_label
(
span
,
"cannot break inside of a closure"
)
.emit
();
}
Normal
=>
{
Normal
|
AnonConst
=>
{
struct_span_err!
(
self
.sess
,
span
,
E0268
,
"`{}` outside of loop"
,
name
)
.span_label
(
span
,
"cannot break outside of a loop"
)
.emit
();
...
...
src/test/ui/array-break-length.rs
0 → 100644
浏览文件 @
7ad1c62d
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn
main
()
{
loop
{
|
_
:
[
_
;
break
]|
{}
//~ ERROR: `break` outside of loop
}
loop
{
|
_
:
[
_
;
continue
]|
{}
//~ ERROR: `continue` outside of loop
}
}
src/test/ui/array-break-length.stderr
0 → 100644
浏览文件 @
7ad1c62d
error[E0268]: `break` outside of loop
--> $DIR/array-break-length.rs:13:17
|
LL | |_: [_; break]| {} //~ ERROR: `break` outside of loop
| ^^^^^ cannot break outside of a loop
error[E0268]: `continue` outside of loop
--> $DIR/array-break-length.rs:17:17
|
LL | |_: [_; continue]| {} //~ ERROR: `continue` outside of loop
| ^^^^^^^^ cannot break outside of a loop
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0268`.
src/test/ui/closure-array-break-length.rs
浏览文件 @
7ad1c62d
...
...
@@ -12,6 +12,8 @@ fn main() {
|
_
:
[
_
;
continue
]|
{};
//~ ERROR: `continue` outside of loop
while
|
_
:
[
_
;
continue
]|
{}
{}
//~ ERROR: `break` or `continue` with no label
//~^ ERROR: `continue` outside of loop
while
|
_
:
[
_
;
break
]|
{}
{}
//~ ERROR: `break` or `continue` with no label
//~^ ERROR: `break` outside of loop
}
src/test/ui/closure-array-break-length.stderr
浏览文件 @
7ad1c62d
...
...
@@ -10,13 +10,25 @@ error[E0590]: `break` or `continue` with no label in the condition of a `while`
LL | while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label
| ^^^^^^^^ unlabeled `continue` in the condition of a `while` loop
error[E0268]: `continue` outside of loop
--> $DIR/closure-array-break-length.rs:14:19
|
LL | while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label
| ^^^^^^^^ cannot break outside of a loop
error[E0590]: `break` or `continue` with no label in the condition of a `while` loop
--> $DIR/closure-array-break-length.rs:1
6
:19
--> $DIR/closure-array-break-length.rs:1
7
:19
|
LL | while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label
| ^^^^^ unlabeled `break` in the condition of a `while` loop
error: aborting due to 3 previous errors
error[E0268]: `break` outside of loop
--> $DIR/closure-array-break-length.rs:17:19
|
LL | while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label
| ^^^^^ cannot break outside of a loop
error: aborting due to 5 previous errors
Some errors occurred: E0268, E0590.
For more information about an error, try `rustc --explain E0268`.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录