Skip to content

Commit

Permalink
Don't install default projection bound for RPITITs
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Jul 30, 2023
1 parent a8be6e0 commit 0f0ab89
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 8 deletions.
8 changes: 1 addition & 7 deletions compiler/rustc_metadata/src/rmeta/encoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down
4 changes: 3 additions & 1 deletion compiler/rustc_ty_utils/src/ty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
10 changes: 10 additions & 0 deletions tests/ui/impl-trait/in-trait/check-wf-on-non-defaulted-rpitit.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![feature(return_position_impl_trait_in_trait)]

struct Wrapper<G: Send>(G);

trait Foo {
fn bar() -> Wrapper<impl Sized>;
//~^ ERROR `impl Sized` cannot be sent between threads safely
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -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>;
| ^^^^^^^^^^^^^^^^^^^ `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: Send>(G);
| ^^^^ required by this bound in `Wrapper`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.

0 comments on commit 0f0ab89

Please sign in to comment.