Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
c8a8a23a
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,发现更多精彩内容 >>
未验证
提交
c8a8a23a
编写于
6月 16, 2021
作者:
Y
Yuki Okushi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Do not emit invalid suggestions on multiple mutable borrow errors
上级
607d6b00
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
58 addition
and
8 deletion
+58
-8
compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs
...rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs
+8
-0
compiler/rustc_mir/src/borrow_check/diagnostics/explain_borrow.rs
.../rustc_mir/src/borrow_check/diagnostics/explain_borrow.rs
+18
-8
src/test/ui/borrowck/issue-85581.rs
src/test/ui/borrowck/issue-85581.rs
+15
-0
src/test/ui/borrowck/issue-85581.stderr
src/test/ui/borrowck/issue-85581.stderr
+17
-0
未找到文件。
compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs
浏览文件 @
c8a8a23a
...
...
@@ -453,6 +453,7 @@ pub(in crate::borrow_check) fn report_move_out_while_borrowed(
&
mut
err
,
""
,
Some
(
borrow_span
),
None
,
);
err
.buffer
(
&
mut
self
.errors_buffer
);
}
...
...
@@ -498,6 +499,7 @@ pub(in crate::borrow_check) fn report_use_while_mutably_borrowed(
&
mut
err
,
""
,
None
,
None
,
);
err
}
...
...
@@ -718,6 +720,7 @@ pub(in crate::borrow_check) fn report_conflicting_borrow(
&
mut
err
,
first_borrow_desc
,
None
,
Some
((
issued_span
,
span
)),
);
err
...
...
@@ -1076,6 +1079,7 @@ fn report_local_value_does_not_live_long_enough(
&
mut
err
,
""
,
None
,
None
,
);
}
}
else
{
...
...
@@ -1093,6 +1097,7 @@ fn report_local_value_does_not_live_long_enough(
&
mut
err
,
""
,
None
,
None
,
);
}
...
...
@@ -1158,6 +1163,7 @@ fn report_borrow_conflicts_with_destructor(
&
mut
err
,
""
,
None
,
None
,
);
err
.buffer
(
&
mut
self
.errors_buffer
);
...
...
@@ -1236,6 +1242,7 @@ fn report_temporary_value_does_not_live_long_enough(
&
mut
err
,
""
,
None
,
None
,
);
let
within
=
if
borrow_spans
.for_generator
()
{
" by generator"
}
else
{
""
};
...
...
@@ -1614,6 +1621,7 @@ pub(in crate::borrow_check) fn report_illegal_mutation_of_borrowed(
&
mut
err
,
""
,
None
,
None
,
);
self
.explain_deref_coercion
(
loan
,
&
mut
err
);
...
...
compiler/rustc_mir/src/borrow_check/diagnostics/explain_borrow.rs
浏览文件 @
c8a8a23a
...
...
@@ -66,6 +66,7 @@ pub(in crate::borrow_check) fn add_explanation_to_diagnostic<'tcx>(
err
:
&
mut
DiagnosticBuilder
<
'_
>
,
borrow_desc
:
&
str
,
borrow_span
:
Option
<
Span
>
,
multiple_borrow_span
:
Option
<
(
Span
,
Span
)
>
,
)
{
match
*
self
{
BorrowExplanation
::
UsedLater
(
later_use_kind
,
var_or_use_span
,
path_span
)
=>
{
...
...
@@ -192,14 +193,23 @@ pub(in crate::borrow_check) fn add_explanation_to_diagnostic<'tcx>(
if
let
Some
(
info
)
=
&
local_decl
.is_block_tail
{
if
info
.tail_result_is_ignored
{
err
.span_suggestion_verbose
(
info
.span
.shrink_to_hi
(),
"consider adding semicolon after the expression so its
\
temporaries are dropped sooner, before the local variables
\
declared by the block are dropped"
,
";"
.to_string
(),
Applicability
::
MaybeIncorrect
,
);
// #85581: If the first mutable borrow's scope contains
// the second borrow, this suggestion isn't helpful.
if
!
multiple_borrow_span
.map
(|(
old
,
new
)|
{
old
.to
(
info
.span
.shrink_to_hi
())
.contains
(
new
)
})
.unwrap_or
(
false
)
{
err
.span_suggestion_verbose
(
info
.span
.shrink_to_hi
(),
"consider adding semicolon after the expression so its
\
temporaries are dropped sooner, before the local variables
\
declared by the block are dropped"
,
";"
.to_string
(),
Applicability
::
MaybeIncorrect
,
);
}
}
else
{
err
.note
(
"the temporary is part of an expression at the end of a
\
...
...
src/test/ui/borrowck/issue-85581.rs
0 → 100644
浏览文件 @
c8a8a23a
// Regression test of #85581.
// Checks not to suggest to add `;` when the second mutable borrow
// is in the first's scope.
use
std
::
collections
::
BinaryHeap
;
fn
foo
(
heap
:
&
mut
BinaryHeap
<
i32
>
)
{
match
heap
.peek_mut
()
{
Some
(
_
)
=>
{
heap
.pop
();
},
//~^ ERROR: cannot borrow `*heap` as mutable more than once at a time
None
=>
(),
}
}
fn
main
()
{}
src/test/ui/borrowck/issue-85581.stderr
0 → 100644
浏览文件 @
c8a8a23a
error[E0499]: cannot borrow `*heap` as mutable more than once at a time
--> $DIR/issue-85581.rs:9:22
|
LL | match heap.peek_mut() {
| ---------------
| |
| first mutable borrow occurs here
| a temporary with access to the first borrow is created here ...
LL | Some(_) => { heap.pop(); },
| ^^^^ second mutable borrow occurs here
...
LL | }
| - ... and the first borrow might be used here, when that temporary is dropped and runs the destructor for type `Option<PeekMut<'_, i32>>`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0499`.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录