Skip to content

Commit e5effbd

Browse files
committed
Auto merge of #94552 - lcnr:fix-94502, r=oli-obk
[beta] backport fix for #94502 this issue was fixed as part of #93368, so i extracted the change from there closes #94502
2 parents c1d075a + a392f15 commit e5effbd

File tree

5 files changed

+57
-3
lines changed

5 files changed

+57
-3
lines changed

compiler/rustc_borrowck/src/diagnostics/outlives_suggestion.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,6 @@ impl OutlivesSuggestionBuilder {
256256
diag.sort_span = mir_span.shrink_to_hi();
257257

258258
// Buffer the diagnostic
259-
mbcx.buffer_error(diag);
259+
mbcx.buffer_non_error_diag(diag);
260260
}
261261
}

compiler/rustc_borrowck/src/lib.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ fn do_mir_borrowck<'a, 'tcx>(
398398
diag.message = initial_diag.styled_message().clone();
399399
diag.span = initial_diag.span.clone();
400400

401-
mbcx.buffer_error(diag);
401+
mbcx.buffer_non_error_diag(diag);
402402
},
403403
);
404404
initial_diag.cancel();
@@ -2317,6 +2317,11 @@ mod error {
23172317
t.buffer(&mut self.buffered);
23182318
}
23192319

2320+
// For diagnostics we must not set `tainted_by_errors`.
2321+
pub fn buffer_non_error_diag(&mut self, t: DiagnosticBuilder<'_>) {
2322+
t.buffer(&mut self.buffered);
2323+
}
2324+
23202325
pub fn set_tainted_by_errors(&mut self) {
23212326
self.tainted_by_errors = Some(ErrorReported {});
23222327
}
@@ -2327,6 +2332,10 @@ mod error {
23272332
self.errors.buffer_error(t);
23282333
}
23292334

2335+
pub fn buffer_non_error_diag(&mut self, t: DiagnosticBuilder<'_>) {
2336+
self.errors.buffer_non_error_diag(t);
2337+
}
2338+
23302339
pub fn buffer_move_error(
23312340
&mut self,
23322341
move_out_indices: Vec<MoveOutIndex>,

compiler/rustc_borrowck/src/nll.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ pub(super) fn dump_annotation<'a, 'tcx>(
417417
err.note(&format!("Inferred opaque type values:\n{:#?}", opaque_type_values));
418418
}
419419

420-
errors.buffer_error(err);
420+
errors.buffer_non_error_diag(err);
421421
}
422422

423423
fn for_each_region_constraint(

src/test/ui/nll/lint-no-err.rs

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// check-pass
2+
3+
// mir borrowck previously incorrectly set `tainted_by_errors`
4+
// when buffering lints, which resulted in ICE later on,
5+
// see #94502.
6+
7+
// Errors with `nll` which is already tested in enough other tests,
8+
// so we ignore it here.
9+
//
10+
// ignore-compare-mode-nll
11+
12+
struct Repro;
13+
impl Repro {
14+
fn get(&self) -> &i32 {
15+
&3
16+
}
17+
18+
fn insert(&mut self, _: i32) {}
19+
}
20+
21+
fn main() {
22+
let x = &0;
23+
let mut conflict = Repro;
24+
let prev = conflict.get();
25+
conflict.insert(*prev + *x);
26+
//~^ WARN cannot borrow `conflict` as mutable because it is also borrowed as immutable
27+
//~| WARN this borrowing pattern was not meant to be accepted
28+
}

src/test/ui/nll/lint-no-err.stderr

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
warning: cannot borrow `conflict` as mutable because it is also borrowed as immutable
2+
--> $DIR/lint-no-err.rs:25:5
3+
|
4+
LL | let prev = conflict.get();
5+
| -------------- immutable borrow occurs here
6+
LL | conflict.insert(*prev + *x);
7+
| ^^^^^^^^^^^^^^^^-----^^^^^^
8+
| | |
9+
| | immutable borrow later used here
10+
| mutable borrow occurs here
11+
|
12+
= note: `#[warn(mutable_borrow_reservation_conflict)]` on by default
13+
= warning: this borrowing pattern was not meant to be accepted, and may become a hard error in the future
14+
= note: for more information, see issue #59159 <https://github.com/rust-lang/rust/issues/59159>
15+
16+
warning: 1 warning emitted
17+

0 commit comments

Comments
 (0)