Skip to content

Commit eec3e14

Browse files
committed
hanging diag
1 parent aa029ce commit eec3e14

11 files changed

+1359
-310
lines changed

compiler/rustc_borrowck/messages.ftl

+356-8
Large diffs are not rendered by default.

compiler/rustc_borrowck/src/borrowck_errors.rs

+222-162
Large diffs are not rendered by default.

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1911,6 +1911,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
19111911
/// cannot borrow `a.u` (via `a.u.z.c`) as immutable because it is also borrowed as
19121912
/// mutable (via `a.u.s.b`) [E0502]
19131913
/// ```
1914+
// FIXME(#100717): In the return value, the first three strings can contain untranslated text.
19141915
pub(crate) fn describe_place_for_conflicting_borrow(
19151916
&self,
19161917
first_borrowed_place: Place<'tcx>,

compiler/rustc_borrowck/src/diagnostics/mod.rs

+20-9
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::session_diagnostics::{
55
CaptureVarKind, CaptureVarPathUseCause, OnClosureNote,
66
};
77
use itertools::Itertools;
8-
use rustc_errors::{Applicability, Diag};
8+
use rustc_errors::{Applicability, Diag, DiagArgValue, IntoDiagnosticArg};
99
use rustc_hir as hir;
1010
use rustc_hir::def::{CtorKind, Namespace};
1111
use rustc_hir::CoroutineKind;
@@ -48,7 +48,7 @@ mod region_errors;
4848

4949
pub(crate) use bound_region_errors::{ToUniverseInfo, UniverseInfo};
5050
pub(crate) use move_errors::{IllegalMoveOriginKind, MoveError};
51-
pub(crate) use mutability_errors::AccessKind;
51+
pub(crate) use mutability_errors::{AccessKind, PlaceAndReason};
5252
pub(crate) use outlives_suggestion::OutlivesSuggestionBuilder;
5353
pub(crate) use region_errors::{ErrorConstraintInfo, RegionErrorKind, RegionErrors};
5454
pub(crate) use region_name::{RegionName, RegionNameSource};
@@ -64,6 +64,18 @@ pub(super) struct DescribePlaceOpt {
6464

6565
pub(super) struct IncludingTupleField(pub(super) bool);
6666

67+
#[derive(Debug)]
68+
pub(super) struct DescribedPlace(pub(super) Option<String>);
69+
70+
impl IntoDiagnosticArg for DescribedPlace {
71+
fn into_diagnostic_arg(self) -> DiagArgValue {
72+
match self.0 {
73+
Some(descr) => descr.into_diagnostic_arg(),
74+
None => "value".into_diagnostic_arg(),
75+
}
76+
}
77+
}
78+
6779
impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
6880
/// Adds a suggestion when a closure is invoked twice with a moved variable or when a closure
6981
/// is moved after being invoked.
@@ -76,7 +88,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
7688
/// LL | for (key, value) in dict {
7789
/// | ^^^^
7890
/// ```
79-
#[allow(rustc::diagnostic_outside_of_impl)] // FIXME
8091
pub(super) fn add_moved_or_invoked_closure_note(
8192
&self,
8293
location: Location,
@@ -176,6 +187,10 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
176187
}
177188
}
178189

190+
pub(super) fn describe_place_typed(&self, place_ref: PlaceRef<'tcx>) -> DescribedPlace {
191+
DescribedPlace(self.describe_place(place_ref))
192+
}
193+
179194
/// End-user visible description of `place` if one can be found.
180195
/// If the place is a temporary for instance, `None` will be returned.
181196
pub(super) fn describe_place(&self, place_ref: PlaceRef<'tcx>) -> Option<String> {
@@ -586,7 +601,6 @@ impl UseSpans<'_> {
586601
}
587602

588603
/// Add a span label to the arguments of the closure, if it exists.
589-
#[allow(rustc::diagnostic_outside_of_impl)]
590604
pub(super) fn args_subdiag(
591605
self,
592606
dcx: &rustc_errors::DiagCtxt,
@@ -600,7 +614,6 @@ impl UseSpans<'_> {
600614

601615
/// Add a span label to the use of the captured variable, if it exists.
602616
/// only adds label to the `path_span`
603-
#[allow(rustc::diagnostic_outside_of_impl)]
604617
pub(super) fn var_path_only_subdiag(
605618
self,
606619
dcx: &rustc_errors::DiagCtxt,
@@ -638,7 +651,6 @@ impl UseSpans<'_> {
638651
}
639652

640653
/// Add a subdiagnostic to the use of the captured variable, if it exists.
641-
#[allow(rustc::diagnostic_outside_of_impl)]
642654
pub(super) fn var_subdiag(
643655
self,
644656
dcx: &rustc_errors::DiagCtxt,
@@ -703,6 +715,7 @@ impl UseSpans<'_> {
703715
}
704716
}
705717

718+
#[derive(Clone, Copy, Debug)]
706719
pub(super) enum BorrowedContentSource<'tcx> {
707720
DerefRawPointer,
708721
DerefMutableRef,
@@ -754,7 +767,7 @@ impl<'tcx> BorrowedContentSource<'tcx> {
754767
_ => None,
755768
})
756769
.unwrap_or_else(|| format!("dereference of `{ty}`")),
757-
BorrowedContentSource::OverloadedIndex(ty) => format!("an index of `{ty}`"),
770+
BorrowedContentSource::OverloadedIndex(ty) => format!("`{ty}`"),
758771
}
759772
}
760773

@@ -1012,8 +1025,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
10121025
self.borrow_spans(span, borrow.reserve_location)
10131026
}
10141027

1015-
#[allow(rustc::diagnostic_outside_of_impl)]
1016-
#[allow(rustc::untranslatable_diagnostic)] // FIXME: make this translatable
10171028
fn explain_captures(
10181029
&mut self,
10191030
err: &mut Diag<'_>,

compiler/rustc_borrowck/src/diagnostics/move_errors.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use rustc_span::{BytePos, ExpnKind, MacroKind, Span};
1010
use crate::diagnostics::CapturedMessageOpt;
1111
use crate::diagnostics::{DescribePlaceOpt, UseSpans};
1212
use crate::prefixes::PrefixSet;
13+
use crate::session_diagnostics::AddMoveErr;
1314
use crate::MirBorrowckCtxt;
1415

1516
#[derive(Debug)]
@@ -575,9 +576,9 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
575576
let binding_span = bind_to.source_info.span;
576577

577578
if j == 0 {
578-
err.span_label(binding_span, "data moved here");
579+
err.subdiagnostic(self.dcx(), AddMoveErr::Here { binding_span });
579580
} else {
580-
err.span_label(binding_span, "...and here");
581+
err.subdiagnostic(self.dcx(), AddMoveErr::AndHere { binding_span });
581582
}
582583

583584
if binds_to.len() == 1 {
@@ -595,10 +596,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
595596
}
596597

597598
if binds_to.len() > 1 {
598-
err.note(
599-
"move occurs because these variables have types that don't implement the `Copy` \
600-
trait",
601-
);
599+
err.subdiagnostic(self.dcx(), AddMoveErr::MovedNotCopy);
602600
}
603601
}
604602

0 commit comments

Comments
 (0)