Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
6d4989b8
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,发现更多精彩内容 >>
提交
6d4989b8
编写于
9月 24, 2017
作者:
K
Keith Yeung
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add span label to E0384 for MIR borrowck
上级
f71b37bc
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
42 addition
and
11 deletion
+42
-11
src/librustc_mir/borrow_check.rs
src/librustc_mir/borrow_check.rs
+24
-6
src/test/compile-fail/borrowck/borrowck-match-binding-is-assignment.rs
...ile-fail/borrowck/borrowck-match-binding-is-assignment.rs
+18
-5
未找到文件。
src/librustc_mir/borrow_check.rs
浏览文件 @
6d4989b8
...
...
@@ -580,7 +580,19 @@ fn check_if_reassignment_to_immutable_state(&mut self,
if
flow_state
.inits.curr_state
.contains
(
&
mpi
)
{
// may already be assigned before reaching this statement;
// report error.
self
.report_illegal_reassignment
(
context
,
(
lvalue
,
span
));
// FIXME: Not ideal, it only finds the assignment that lexically comes first
let
assigned_lvalue
=
&
move_data
.move_paths
[
mpi
]
.lvalue
;
let
assignment_stmt
=
self
.mir
.basic_blocks
()
.iter
()
.filter_map
(|
bb
|
{
bb
.statements
.iter
()
.find
(|
stmt
|
{
if
let
StatementKind
::
Assign
(
ref
lv
,
_
)
=
stmt
.kind
{
*
lv
==
*
assigned_lvalue
}
else
{
false
}
})
})
.next
()
.unwrap
();
self
.report_illegal_reassignment
(
context
,
(
lvalue
,
span
),
assignment_stmt
.source_info.span
);
}
}
}
...
...
@@ -982,11 +994,17 @@ fn report_illegal_mutation_of_borrowed(&mut self, _: Context, (lvalue, span): (&
err
.emit
();
}
fn
report_illegal_reassignment
(
&
mut
self
,
_
context
:
Context
,
(
lvalue
,
span
):
(
&
Lvalue
,
Span
))
{
let
mut
err
=
self
.tcx
.cannot_reassign_immutable
(
span
,
&
self
.describe_lvalue
(
lvalue
),
Origin
::
Mir
);
// FIXME: add span labels for borrow and assignment points
err
.emit
();
fn
report_illegal_reassignment
(
&
mut
self
,
_
context
:
Context
,
(
lvalue
,
span
):
(
&
Lvalue
,
Span
),
assigned_span
:
Span
)
{
self
.tcx
.cannot_reassign_immutable
(
span
,
&
self
.describe_lvalue
(
lvalue
),
Origin
::
Mir
)
.span_label
(
span
,
"re-assignment of immutable variable"
)
.span_label
(
assigned_span
,
format!
(
"first assignment to `{}`"
,
self
.describe_lvalue
(
lvalue
)))
.emit
();
}
fn
report_assignment_to_static
(
&
mut
self
,
_
context
:
Context
,
(
lvalue
,
span
):
(
&
Lvalue
,
Span
))
{
...
...
src/test/compile-fail/borrowck/borrowck-match-binding-is-assignment.rs
浏览文件 @
6d4989b8
...
...
@@ -8,6 +8,9 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// revisions: ast mir
//[mir]compile-flags: -Zemit-end-regions -Zborrowck-mir
// Test that immutable pattern bindings cannot be reassigned.
#![feature(slice_patterns)]
...
...
@@ -23,31 +26,41 @@ struct S {
pub
fn
main
()
{
match
1
{
x
=>
{
x
+=
1
;
//~ ERROR re-assignment of immutable variable `x`
x
+=
1
;
//[ast]~ ERROR re-assignment of immutable variable `x`
//[mir]~^ ERROR (Mir) [E0384]
//[mir]~| ERROR (Ast) [E0384]
}
}
match
E
::
Foo
(
1
)
{
E
::
Foo
(
x
)
=>
{
x
+=
1
;
//~ ERROR re-assignment of immutable variable `x`
x
+=
1
;
//[ast]~ ERROR re-assignment of immutable variable `x`
//[mir]~^ ERROR (Mir) [E0384]
//[mir]~| ERROR (Ast) [E0384]
}
}
match
(
S
{
bar
:
1
})
{
S
{
bar
:
x
}
=>
{
x
+=
1
;
//~ ERROR re-assignment of immutable variable `x`
x
+=
1
;
//[ast]~ ERROR re-assignment of immutable variable `x`
//[mir]~^ ERROR (Mir) [E0384]
//[mir]~| ERROR (Ast) [E0384]
}
}
match
(
1
,)
{
(
x
,)
=>
{
x
+=
1
;
//~ ERROR re-assignment of immutable variable `x`
x
+=
1
;
//[ast]~ ERROR re-assignment of immutable variable `x`
//[mir]~^ ERROR (Mir) [E0384]
//[mir]~| ERROR (Ast) [E0384]
}
}
match
[
1
,
2
,
3
]
{
[
x
,
_
,
_
]
=>
{
x
+=
1
;
//~ ERROR re-assignment of immutable variable `x`
x
+=
1
;
//[ast]~ ERROR re-assignment of immutable variable `x`
//[mir]~^ ERROR (Mir) [E0384]
//[mir]~| ERROR (Ast) [E0384]
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录