From 75461633350a24c3c23d387155c200ae31ccc870 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Thu, 3 Feb 2022 15:53:23 +0000 Subject: [PATCH] Improve self-referential diagnostic somewhat --- compiler/rustc_middle/src/ty/print/pretty.rs | 31 ++++++++++++------- src/test/ui/type-alias-impl-trait/nested.rs | 2 +- .../ui/type-alias-impl-trait/nested.stderr | 6 ++-- .../type-alias-impl-trait/self-referential.rs | 2 +- .../self-referential.stderr | 6 ++-- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/compiler/rustc_middle/src/ty/print/pretty.rs b/compiler/rustc_middle/src/ty/print/pretty.rs index 62a0143817a9c..11a3ee5362967 100644 --- a/compiler/rustc_middle/src/ty/print/pretty.rs +++ b/compiler/rustc_middle/src/ty/print/pretty.rs @@ -644,20 +644,18 @@ pub trait PrettyPrinter<'tcx>: return Ok(self); } - return with_no_queries(|| { - let def_key = self.tcx().def_key(def_id); - if let Some(name) = def_key.disambiguated_data.data.get_opt_name() { - p!(write("{}", name)); - // FIXME(eddyb) print this with `print_def_path`. - if !substs.is_empty() { - p!("::"); - p!(generic_delimiters(|cx| cx.comma_sep(substs.iter()))); - } - return Ok(self); + let def_key = self.tcx().def_key(def_id); + if let Some(name) = def_key.disambiguated_data.data.get_opt_name() { + p!(write("{}", name)); + // FIXME(eddyb) print this with `print_def_path`. + if !substs.is_empty() { + p!("::"); + p!(generic_delimiters(|cx| cx.comma_sep(substs.iter()))); } + return Ok(self); + } - self.pretty_print_opaque_impl_type(def_id, substs) - }); + return self.pretty_print_opaque_impl_type(def_id, substs); } ty::Str => p!("str"), ty::Generator(did, substs, movability) => { @@ -900,6 +898,15 @@ pub trait PrettyPrinter<'tcx>: if !first { p!(", "); } + if let GenericArgKind::Type(ty) = ty.unpack() { + if let ty::Opaque(d, substs) = *ty.kind() { + if d == def_id { + p!(print_def_path(d, substs)); + first = false; + continue; + } + } + } p!(print(trait_ref.rebind(*ty))); first = false; } diff --git a/src/test/ui/type-alias-impl-trait/nested.rs b/src/test/ui/type-alias-impl-trait/nested.rs index 4cdfbf0804106..e55fe3a3aafe7 100644 --- a/src/test/ui/type-alias-impl-trait/nested.rs +++ b/src/test/ui/type-alias-impl-trait/nested.rs @@ -13,5 +13,5 @@ fn bar() -> Bar { fn main() { println!("{:?}", bar()); - //~^ ERROR `impl Trait` doesn't implement `Debug` + //~^ ERROR `impl Trait` doesn't implement `Debug` } diff --git a/src/test/ui/type-alias-impl-trait/nested.stderr b/src/test/ui/type-alias-impl-trait/nested.stderr index 43bdd73454b28..eff56e3b76d9c 100644 --- a/src/test/ui/type-alias-impl-trait/nested.stderr +++ b/src/test/ui/type-alias-impl-trait/nested.stderr @@ -1,10 +1,10 @@ -error[E0277]: `impl Trait` doesn't implement `Debug` +error[E0277]: `impl Trait` doesn't implement `Debug` --> $DIR/nested.rs:15:22 | LL | println!("{:?}", bar()); - | ^^^^^ `impl Trait` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | ^^^^^ `impl Trait` cannot be formatted using `{:?}` because it doesn't implement `Debug` | - = help: the trait `Debug` is not implemented for `impl Trait` + = help: the trait `Debug` is not implemented for `impl Trait` = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to previous error diff --git a/src/test/ui/type-alias-impl-trait/self-referential.rs b/src/test/ui/type-alias-impl-trait/self-referential.rs index d5085b9419e8e..46468bc98b968 100644 --- a/src/test/ui/type-alias-impl-trait/self-referential.rs +++ b/src/test/ui/type-alias-impl-trait/self-referential.rs @@ -3,7 +3,7 @@ type Bar<'a, 'b> = impl PartialEq> + std::fmt::Debug; fn bar<'a, 'b>(i: &'a i32) -> Bar<'a, 'b> { - i //~ ERROR can't compare `&i32` with `impl PartialEq } fn main() { diff --git a/src/test/ui/type-alias-impl-trait/self-referential.stderr b/src/test/ui/type-alias-impl-trait/self-referential.stderr index 8bc2cb9b05cd1..29f1e0bec083d 100644 --- a/src/test/ui/type-alias-impl-trait/self-referential.stderr +++ b/src/test/ui/type-alias-impl-trait/self-referential.stderr @@ -1,10 +1,10 @@ -error[E0277]: can't compare `&i32` with `impl PartialEq + Debug` +error[E0277]: can't compare `&i32` with `impl PartialEq::{opaque#0}> + Debug` --> $DIR/self-referential.rs:6:5 | LL | i - | ^ no implementation for `&i32 == impl PartialEq + Debug` + | ^ no implementation for `&i32 == impl PartialEq::{opaque#0}> + Debug` | - = help: the trait `PartialEq + Debug>` is not implemented for `&i32` + = help: the trait `PartialEq::{opaque#0}> + Debug>` is not implemented for `&i32` error: aborting due to previous error