Skip to content

Commit 4ed1376

Browse files
committed
On E0275 do not print out the full type in the msg
When printing requirement overflow errors, do not print out the full type name when it is longer than 50 characters long.
1 parent 787e633 commit 4ed1376

File tree

4 files changed

+45
-11
lines changed

4 files changed

+45
-11
lines changed

compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use rustc_errors::{
2222
MultiSpan, Style,
2323
};
2424
use rustc_hir as hir;
25+
use rustc_hir::def::Namespace;
2526
use rustc_hir::def_id::DefId;
2627
use rustc_hir::intravisit::Visitor;
2728
use rustc_hir::GenericParam;
@@ -34,6 +35,7 @@ use rustc_middle::traits::select::OverflowError;
3435
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
3536
use rustc_middle::ty::error::ExpectedFound;
3637
use rustc_middle::ty::fold::{TypeFolder, TypeSuperFoldable};
38+
use rustc_middle::ty::print::{FmtPrinter, Print};
3739
use rustc_middle::ty::{
3840
self, SubtypePredicate, ToPolyTraitRef, ToPredicate, TraitRef, Ty, TyCtxt, TypeFoldable,
3941
TypeVisitable,
@@ -109,7 +111,10 @@ pub trait TypeErrCtxtExt<'tcx> {
109111
suggest_increasing_limit: bool,
110112
) -> !
111113
where
112-
T: fmt::Display + TypeFoldable<'tcx>;
114+
T: fmt::Display
115+
+ TypeFoldable<'tcx>
116+
+ Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>,
117+
<T as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug;
113118

114119
fn suggest_new_overflow_limit(&self, err: &mut Diagnostic);
115120

@@ -468,15 +473,31 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
468473
suggest_increasing_limit: bool,
469474
) -> !
470475
where
471-
T: fmt::Display + TypeFoldable<'tcx>,
476+
T: fmt::Display
477+
+ TypeFoldable<'tcx>
478+
+ Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>,
479+
<T as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug,
472480
{
473481
let predicate = self.resolve_vars_if_possible(obligation.predicate.clone());
482+
let mut pred_str = predicate.to_string();
483+
if pred_str.len() > 50 {
484+
// We don't need to save the type to a file, we will be talking about this type already
485+
// in a separate note when we explain the obligation, so it will be available that way.
486+
pred_str = predicate
487+
.print(FmtPrinter::new_with_limit(
488+
self.tcx,
489+
Namespace::TypeNS,
490+
rustc_session::Limit(6),
491+
))
492+
.unwrap()
493+
.into_buffer();
494+
}
474495
let mut err = struct_span_err!(
475496
self.tcx.sess,
476497
obligation.cause.span,
477498
E0275,
478499
"overflow evaluating the requirement `{}`",
479-
predicate
500+
pred_str,
480501
);
481502

482503
if suggest_increasing_limit {

compiler/rustc_trait_selection/src/traits/select/mod.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ use rustc_middle::mir::interpret::ErrorHandled;
4242
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
4343
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams};
4444
use rustc_middle::ty::fold::BottomUpFolder;
45+
use rustc_middle::ty::print::{FmtPrinter, Print};
4546
use rustc_middle::ty::relate::TypeRelation;
4647
use rustc_middle::ty::SubstsRef;
4748
use rustc_middle::ty::{self, EarlyBinder, PolyProjectionPredicate, ToPolyTraitRef, ToPredicate};
@@ -1081,11 +1082,17 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
10811082
it.for_each(|o| o.recursion_depth = cmp::max(min_depth, o.recursion_depth) + 1);
10821083
}
10831084

1084-
fn check_recursion_depth<T: Display + TypeFoldable<'tcx>>(
1085+
fn check_recursion_depth<T>(
10851086
&self,
10861087
depth: usize,
10871088
error_obligation: &Obligation<'tcx, T>,
1088-
) -> Result<(), OverflowError> {
1089+
) -> Result<(), OverflowError>
1090+
where
1091+
T: fmt::Display
1092+
+ TypeFoldable<'tcx>
1093+
+ Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>,
1094+
<T as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug,
1095+
{
10891096
if !self.infcx.tcx.recursion_limit().value_within_limit(depth) {
10901097
match self.query_mode {
10911098
TraitQueryMode::Standard => {
@@ -1109,11 +1116,17 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
11091116
/// The weird return type of this function allows it to be used with the `try` (`?`)
11101117
/// operator within certain functions.
11111118
#[inline(always)]
1112-
fn check_recursion_limit<T: Display + TypeFoldable<'tcx>, V: Display + TypeFoldable<'tcx>>(
1119+
fn check_recursion_limit<T: Display + TypeFoldable<'tcx>, V>(
11131120
&self,
11141121
obligation: &Obligation<'tcx, T>,
11151122
error_obligation: &Obligation<'tcx, V>,
1116-
) -> Result<(), OverflowError> {
1123+
) -> Result<(), OverflowError>
1124+
where
1125+
V: fmt::Display
1126+
+ TypeFoldable<'tcx>
1127+
+ Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>,
1128+
<V as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug,
1129+
{
11171130
self.check_recursion_depth(obligation.recursion_depth, error_obligation)
11181131
}
11191132

src/test/ui/error-codes/E0275.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
error[E0275]: overflow evaluating the requirement `Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Foo`
1+
error[E0275]: overflow evaluating the requirement `Bar<Bar<Bar<Bar<Bar<Bar<Bar<...>>>>>>>: Foo`
22
--> $DIR/E0275.rs:6:33
33
|
44
LL | impl<T> Foo for T where Bar<T>: Foo {}

src/test/ui/issues/issue-20413.stderr

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ LL | struct NoData<T>;
77
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
88
= help: if you intended `T` to be a const parameter, use `const T: usize` instead
99

10-
error[E0275]: overflow evaluating the requirement `NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Foo`
10+
error[E0275]: overflow evaluating the requirement `NoData<NoData<NoData<NoData<NoData<NoData<NoData<...>>>>>>>: Foo`
1111
--> $DIR/issue-20413.rs:9:36
1212
|
1313
LL | impl<T> Foo for T where NoData<T>: Foo {
@@ -23,7 +23,7 @@ LL | impl<T> Foo for T where NoData<T>: Foo {
2323
= note: 127 redundant requirements hidden
2424
= note: required for `NoData<T>` to implement `Foo`
2525

26-
error[E0275]: overflow evaluating the requirement `EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Baz`
26+
error[E0275]: overflow evaluating the requirement `EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<...>>>>>>>: Baz`
2727
--> $DIR/issue-20413.rs:28:42
2828
|
2929
LL | impl<T> Bar for T where EvenLessData<T>: Baz {
@@ -45,7 +45,7 @@ LL | impl<T> Baz for T where AlmostNoData<T>: Bar {
4545
= note: 126 redundant requirements hidden
4646
= note: required for `EvenLessData<T>` to implement `Baz`
4747

48-
error[E0275]: overflow evaluating the requirement `AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Bar`
48+
error[E0275]: overflow evaluating the requirement `AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<...>>>>>>>: Bar`
4949
--> $DIR/issue-20413.rs:35:42
5050
|
5151
LL | impl<T> Baz for T where AlmostNoData<T>: Bar {

0 commit comments

Comments
 (0)