From ee9727e263f32d1bc3aa5b8fdbe42098e84aa923 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Thu, 7 Sep 2023 04:51:36 +0000 Subject: [PATCH 1/3] Don't suggest dereferencing to unsized type --- .../src/traits/error_reporting/suggestions.rs | 15 ++++++++++++- .../dont-suggest-unsize-deref.rs | 15 +++++++++++++ .../dont-suggest-unsize-deref.stderr | 22 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.rs create mode 100644 tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.stderr diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs index 611ec6b00ef60..32fb10ce4a676 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs @@ -838,7 +838,20 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> { obligation.param_env, real_trait_pred_and_base_ty, ); - if self.predicate_may_hold(&obligation) { + let sized_obligation = Obligation::new( + self.tcx, + obligation.cause.clone(), + obligation.param_env, + ty::TraitRef::from_lang_item( + self.tcx, + hir::LangItem::Sized, + obligation.cause.span, + [base_ty], + ), + ); + if self.predicate_may_hold(&obligation) + && self.predicate_must_hold_modulo_regions(&sized_obligation) + { let call_node = self.tcx.hir().get(*call_hir_id); let msg = "consider dereferencing here"; let is_receiver = matches!( diff --git a/tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.rs b/tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.rs new file mode 100644 index 0000000000000..8133036991c2b --- /dev/null +++ b/tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.rs @@ -0,0 +1,15 @@ +fn use_iterator(itr: I) +where + I: IntoIterator, +{ +} + +fn pass_iterator(i: &dyn IntoIterator) +where + I: Iterator, +{ + use_iterator(i); + //~^ ERROR `&dyn IntoIterator` is not an iterator +} + +fn main() {} diff --git a/tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.stderr b/tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.stderr new file mode 100644 index 0000000000000..18ce9939eb26b --- /dev/null +++ b/tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.stderr @@ -0,0 +1,22 @@ +error[E0277]: `&dyn IntoIterator` is not an iterator + --> $DIR/dont-suggest-unsize-deref.rs:11:18 + | +LL | use_iterator(i); + | ------------ ^ `&dyn IntoIterator` is not an iterator + | | + | required by a bound introduced by this call + | + = help: the trait `Iterator` is not implemented for `&dyn IntoIterator` + = note: required for `&dyn IntoIterator` to implement `IntoIterator` +note: required by a bound in `use_iterator` + --> $DIR/dont-suggest-unsize-deref.rs:3:8 + | +LL | fn use_iterator(itr: I) + | ------------ required by a bound in this function +LL | where +LL | I: IntoIterator, + | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `use_iterator` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. From 67e7d85ad2c01376c5fe2de5f98f2b4fb4109bb7 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Thu, 7 Sep 2023 04:52:17 +0000 Subject: [PATCH 2/3] Rename folder typo --- .../dont-suggest-unsize-deref.rs | 0 .../dont-suggest-unsize-deref.stderr | 0 .../issue-39029.fixed | 0 .../{suggest-deferences => suggest-dereferences}/issue-39029.rs | 0 .../issue-39029.stderr | 0 .../issue-62530.fixed | 0 .../{suggest-deferences => suggest-dereferences}/issue-62530.rs | 0 .../issue-62530.stderr | 0 .../{suggest-deferences => suggest-dereferences}/multiple-0.fixed | 0 .../{suggest-deferences => suggest-dereferences}/multiple-0.rs | 0 .../multiple-0.stderr | 0 .../{suggest-deferences => suggest-dereferences}/multiple-1.rs | 0 .../multiple-1.stderr | 0 .../root-obligation.fixed | 0 .../root-obligation.rs | 0 .../root-obligation.stderr | 0 .../suggest-dereferencing-receiver-argument.fixed | 0 .../suggest-dereferencing-receiver-argument.rs | 0 .../suggest-dereferencing-receiver-argument.stderr | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/dont-suggest-unsize-deref.rs (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/dont-suggest-unsize-deref.stderr (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/issue-39029.fixed (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/issue-39029.rs (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/issue-39029.stderr (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/issue-62530.fixed (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/issue-62530.rs (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/issue-62530.stderr (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/multiple-0.fixed (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/multiple-0.rs (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/multiple-0.stderr (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/multiple-1.rs (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/multiple-1.stderr (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/root-obligation.fixed (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/root-obligation.rs (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/root-obligation.stderr (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/suggest-dereferencing-receiver-argument.fixed (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/suggest-dereferencing-receiver-argument.rs (100%) rename tests/ui/traits/{suggest-deferences => suggest-dereferences}/suggest-dereferencing-receiver-argument.stderr (100%) diff --git a/tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.rs b/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.rs similarity index 100% rename from tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.rs rename to tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.rs diff --git a/tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.stderr b/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.stderr similarity index 100% rename from tests/ui/traits/suggest-deferences/dont-suggest-unsize-deref.stderr rename to tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.stderr diff --git a/tests/ui/traits/suggest-deferences/issue-39029.fixed b/tests/ui/traits/suggest-dereferences/issue-39029.fixed similarity index 100% rename from tests/ui/traits/suggest-deferences/issue-39029.fixed rename to tests/ui/traits/suggest-dereferences/issue-39029.fixed diff --git a/tests/ui/traits/suggest-deferences/issue-39029.rs b/tests/ui/traits/suggest-dereferences/issue-39029.rs similarity index 100% rename from tests/ui/traits/suggest-deferences/issue-39029.rs rename to tests/ui/traits/suggest-dereferences/issue-39029.rs diff --git a/tests/ui/traits/suggest-deferences/issue-39029.stderr b/tests/ui/traits/suggest-dereferences/issue-39029.stderr similarity index 100% rename from tests/ui/traits/suggest-deferences/issue-39029.stderr rename to tests/ui/traits/suggest-dereferences/issue-39029.stderr diff --git a/tests/ui/traits/suggest-deferences/issue-62530.fixed b/tests/ui/traits/suggest-dereferences/issue-62530.fixed similarity index 100% rename from tests/ui/traits/suggest-deferences/issue-62530.fixed rename to tests/ui/traits/suggest-dereferences/issue-62530.fixed diff --git a/tests/ui/traits/suggest-deferences/issue-62530.rs b/tests/ui/traits/suggest-dereferences/issue-62530.rs similarity index 100% rename from tests/ui/traits/suggest-deferences/issue-62530.rs rename to tests/ui/traits/suggest-dereferences/issue-62530.rs diff --git a/tests/ui/traits/suggest-deferences/issue-62530.stderr b/tests/ui/traits/suggest-dereferences/issue-62530.stderr similarity index 100% rename from tests/ui/traits/suggest-deferences/issue-62530.stderr rename to tests/ui/traits/suggest-dereferences/issue-62530.stderr diff --git a/tests/ui/traits/suggest-deferences/multiple-0.fixed b/tests/ui/traits/suggest-dereferences/multiple-0.fixed similarity index 100% rename from tests/ui/traits/suggest-deferences/multiple-0.fixed rename to tests/ui/traits/suggest-dereferences/multiple-0.fixed diff --git a/tests/ui/traits/suggest-deferences/multiple-0.rs b/tests/ui/traits/suggest-dereferences/multiple-0.rs similarity index 100% rename from tests/ui/traits/suggest-deferences/multiple-0.rs rename to tests/ui/traits/suggest-dereferences/multiple-0.rs diff --git a/tests/ui/traits/suggest-deferences/multiple-0.stderr b/tests/ui/traits/suggest-dereferences/multiple-0.stderr similarity index 100% rename from tests/ui/traits/suggest-deferences/multiple-0.stderr rename to tests/ui/traits/suggest-dereferences/multiple-0.stderr diff --git a/tests/ui/traits/suggest-deferences/multiple-1.rs b/tests/ui/traits/suggest-dereferences/multiple-1.rs similarity index 100% rename from tests/ui/traits/suggest-deferences/multiple-1.rs rename to tests/ui/traits/suggest-dereferences/multiple-1.rs diff --git a/tests/ui/traits/suggest-deferences/multiple-1.stderr b/tests/ui/traits/suggest-dereferences/multiple-1.stderr similarity index 100% rename from tests/ui/traits/suggest-deferences/multiple-1.stderr rename to tests/ui/traits/suggest-dereferences/multiple-1.stderr diff --git a/tests/ui/traits/suggest-deferences/root-obligation.fixed b/tests/ui/traits/suggest-dereferences/root-obligation.fixed similarity index 100% rename from tests/ui/traits/suggest-deferences/root-obligation.fixed rename to tests/ui/traits/suggest-dereferences/root-obligation.fixed diff --git a/tests/ui/traits/suggest-deferences/root-obligation.rs b/tests/ui/traits/suggest-dereferences/root-obligation.rs similarity index 100% rename from tests/ui/traits/suggest-deferences/root-obligation.rs rename to tests/ui/traits/suggest-dereferences/root-obligation.rs diff --git a/tests/ui/traits/suggest-deferences/root-obligation.stderr b/tests/ui/traits/suggest-dereferences/root-obligation.stderr similarity index 100% rename from tests/ui/traits/suggest-deferences/root-obligation.stderr rename to tests/ui/traits/suggest-dereferences/root-obligation.stderr diff --git a/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.fixed b/tests/ui/traits/suggest-dereferences/suggest-dereferencing-receiver-argument.fixed similarity index 100% rename from tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.fixed rename to tests/ui/traits/suggest-dereferences/suggest-dereferencing-receiver-argument.fixed diff --git a/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.rs b/tests/ui/traits/suggest-dereferences/suggest-dereferencing-receiver-argument.rs similarity index 100% rename from tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.rs rename to tests/ui/traits/suggest-dereferences/suggest-dereferencing-receiver-argument.rs diff --git a/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.stderr b/tests/ui/traits/suggest-dereferences/suggest-dereferencing-receiver-argument.stderr similarity index 100% rename from tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.stderr rename to tests/ui/traits/suggest-dereferences/suggest-dereferencing-receiver-argument.stderr From 3bf3dadbc02736c66f56754769dcc001b040862b Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Thu, 7 Sep 2023 06:57:08 +0000 Subject: [PATCH 3/3] Ensure that dyn trait bounds stay sorted --- compiler/rustc_middle/src/ty/print/pretty.rs | 19 ++++++++----------- .../object/enforce-supertrait-projection.rs | 2 +- .../enforce-supertrait-projection.stderr | 2 +- .../dont-suggest-unsize-deref.rs | 2 +- .../dont-suggest-unsize-deref.stderr | 8 ++++---- 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/compiler/rustc_middle/src/ty/print/pretty.rs b/compiler/rustc_middle/src/ty/print/pretty.rs index ac0c88468faa5..83c9269f24e36 100644 --- a/compiler/rustc_middle/src/ty/print/pretty.rs +++ b/compiler/rustc_middle/src/ty/print/pretty.rs @@ -1239,21 +1239,18 @@ pub trait PrettyPrinter<'tcx>: .generics_of(principal.def_id) .own_args_no_defaults(cx.tcx(), principal.args); - let mut projections = predicates.projection_bounds(); - - let mut args = args.iter().cloned(); - let arg0 = args.next(); - let projection0 = projections.next(); - if arg0.is_some() || projection0.is_some() { - let args = arg0.into_iter().chain(args); - let projections = projection0.into_iter().chain(projections); + let mut projections: Vec<_> = predicates.projection_bounds().collect(); + projections.sort_by_cached_key(|proj| { + cx.tcx().item_name(proj.item_def_id()).to_string() + }); + if !args.is_empty() || !projections.is_empty() { p!(generic_delimiters(|mut cx| { - cx = cx.comma_sep(args)?; - if arg0.is_some() && projection0.is_some() { + cx = cx.comma_sep(args.iter().copied())?; + if !args.is_empty() && !projections.is_empty() { write!(cx, ", ")?; } - cx.comma_sep(projections) + cx.comma_sep(projections.iter().copied()) })); } } diff --git a/tests/ui/traits/object/enforce-supertrait-projection.rs b/tests/ui/traits/object/enforce-supertrait-projection.rs index 2c9b41eea2abe..0ea944ec2df55 100644 --- a/tests/ui/traits/object/enforce-supertrait-projection.rs +++ b/tests/ui/traits/object/enforce-supertrait-projection.rs @@ -7,7 +7,7 @@ trait Trait: SuperTrait::B> {} fn transmute(x: A) -> B { foo::>(x) - //~^ ERROR type mismatch resolving ` as SuperTrait>::A == B` + //~^ ERROR type mismatch resolving ` as SuperTrait>::A == B` } fn foo(x: T::A) -> B diff --git a/tests/ui/traits/object/enforce-supertrait-projection.stderr b/tests/ui/traits/object/enforce-supertrait-projection.stderr index 848b4e69a4bb8..2fb94d348966a 100644 --- a/tests/ui/traits/object/enforce-supertrait-projection.stderr +++ b/tests/ui/traits/object/enforce-supertrait-projection.stderr @@ -1,4 +1,4 @@ -error[E0271]: type mismatch resolving ` as SuperTrait>::A == B` +error[E0271]: type mismatch resolving ` as SuperTrait>::A == B` --> $DIR/enforce-supertrait-projection.rs:9:17 | LL | fn transmute(x: A) -> B { diff --git a/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.rs b/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.rs index 8133036991c2b..c6f9e3456186c 100644 --- a/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.rs +++ b/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.rs @@ -9,7 +9,7 @@ where I: Iterator, { use_iterator(i); - //~^ ERROR `&dyn IntoIterator` is not an iterator + //~^ ERROR `&dyn IntoIterator` is not an iterator } fn main() {} diff --git a/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.stderr b/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.stderr index 18ce9939eb26b..bd0e7ca2c02e5 100644 --- a/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.stderr +++ b/tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.stderr @@ -1,13 +1,13 @@ -error[E0277]: `&dyn IntoIterator` is not an iterator +error[E0277]: `&dyn IntoIterator` is not an iterator --> $DIR/dont-suggest-unsize-deref.rs:11:18 | LL | use_iterator(i); - | ------------ ^ `&dyn IntoIterator` is not an iterator + | ------------ ^ `&dyn IntoIterator` is not an iterator | | | required by a bound introduced by this call | - = help: the trait `Iterator` is not implemented for `&dyn IntoIterator` - = note: required for `&dyn IntoIterator` to implement `IntoIterator` + = help: the trait `Iterator` is not implemented for `&dyn IntoIterator` + = note: required for `&dyn IntoIterator` to implement `IntoIterator` note: required by a bound in `use_iterator` --> $DIR/dont-suggest-unsize-deref.rs:3:8 |