From 0f0ab89feb4d668cb989aefe08f27af45cb10bed Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sun, 16 Jul 2023 01:41:20 +0000 Subject: [PATCH] Don't install default projection bound for RPITITs --- compiler/rustc_metadata/src/rmeta/encoder.rs | 8 +------- compiler/rustc_ty_utils/src/ty.rs | 4 +++- .../in-trait/check-wf-on-non-defaulted-rpitit.rs | 10 ++++++++++ .../check-wf-on-non-defaulted-rpitit.stderr | 16 ++++++++++++++++ 4 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 tests/ui/impl-trait/in-trait/check-wf-on-non-defaulted-rpitit.rs create mode 100644 tests/ui/impl-trait/in-trait/check-wf-on-non-defaulted-rpitit.stderr diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 0025dc9033c57..d72053ca98533 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -1144,13 +1144,7 @@ fn should_encode_type(tcx: TyCtxt<'_>, def_id: LocalDefId, def_kind: DefKind) -> let assoc_item = tcx.associated_item(def_id); match assoc_item.container { ty::AssocItemContainer::ImplContainer => true, - // Always encode RPITITs, since we need to be able to project - // from an RPITIT associated item to an opaque when installing - // the default projection predicates in default trait methods - // with RPITITs. - ty::AssocItemContainer::TraitContainer => { - assoc_item.defaultness(tcx).has_value() || assoc_item.is_impl_trait_in_trait() - } + ty::AssocItemContainer::TraitContainer => assoc_item.defaultness(tcx).has_value(), } } DefKind::TyParam => { diff --git a/compiler/rustc_ty_utils/src/ty.rs b/compiler/rustc_ty_utils/src/ty.rs index 2055852eda070..4c896712b1b92 100644 --- a/compiler/rustc_ty_utils/src/ty.rs +++ b/compiler/rustc_ty_utils/src/ty.rs @@ -129,7 +129,9 @@ fn param_env(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ParamEnv<'_> { // sure that this will succeed without errors anyway. if tcx.def_kind(def_id) == DefKind::AssocFn - && tcx.associated_item(def_id).container == ty::AssocItemContainer::TraitContainer + && let assoc_item = tcx.associated_item(def_id) + && assoc_item.container == ty::AssocItemContainer::TraitContainer + && assoc_item.defaultness(tcx).has_value() { let sig = tcx.fn_sig(def_id).instantiate_identity(); // We accounted for the binder of the fn sig, so skip the binder. diff --git a/tests/ui/impl-trait/in-trait/check-wf-on-non-defaulted-rpitit.rs b/tests/ui/impl-trait/in-trait/check-wf-on-non-defaulted-rpitit.rs new file mode 100644 index 0000000000000..742537ffcc43b --- /dev/null +++ b/tests/ui/impl-trait/in-trait/check-wf-on-non-defaulted-rpitit.rs @@ -0,0 +1,10 @@ +#![feature(return_position_impl_trait_in_trait)] + +struct Wrapper(G); + +trait Foo { + fn bar() -> Wrapper; + //~^ ERROR `impl Sized` cannot be sent between threads safely +} + +fn main() {} diff --git a/tests/ui/impl-trait/in-trait/check-wf-on-non-defaulted-rpitit.stderr b/tests/ui/impl-trait/in-trait/check-wf-on-non-defaulted-rpitit.stderr new file mode 100644 index 0000000000000..dee87d0823864 --- /dev/null +++ b/tests/ui/impl-trait/in-trait/check-wf-on-non-defaulted-rpitit.stderr @@ -0,0 +1,16 @@ +error[E0277]: `impl Sized` cannot be sent between threads safely + --> $DIR/check-wf-on-non-defaulted-rpitit.rs:6:17 + | +LL | fn bar() -> Wrapper; + | ^^^^^^^^^^^^^^^^^^^ `impl Sized` cannot be sent between threads safely + | + = help: the trait `Send` is not implemented for `impl Sized` +note: required by a bound in `Wrapper` + --> $DIR/check-wf-on-non-defaulted-rpitit.rs:3:19 + | +LL | struct Wrapper(G); + | ^^^^ required by this bound in `Wrapper` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`.