Don't install default projection bound for RPITITs
This commit is contained in:
parent
a8be6e070f
commit
0f0ab89feb
4 changed files with 30 additions and 8 deletions
|
@ -1144,13 +1144,7 @@ fn should_encode_type(tcx: TyCtxt<'_>, def_id: LocalDefId, def_kind: DefKind) ->
|
||||||
let assoc_item = tcx.associated_item(def_id);
|
let assoc_item = tcx.associated_item(def_id);
|
||||||
match assoc_item.container {
|
match assoc_item.container {
|
||||||
ty::AssocItemContainer::ImplContainer => true,
|
ty::AssocItemContainer::ImplContainer => true,
|
||||||
// Always encode RPITITs, since we need to be able to project
|
ty::AssocItemContainer::TraitContainer => assoc_item.defaultness(tcx).has_value(),
|
||||||
// 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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DefKind::TyParam => {
|
DefKind::TyParam => {
|
||||||
|
|
|
@ -129,7 +129,9 @@ fn param_env(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ParamEnv<'_> {
|
||||||
// sure that this will succeed without errors anyway.
|
// sure that this will succeed without errors anyway.
|
||||||
|
|
||||||
if tcx.def_kind(def_id) == DefKind::AssocFn
|
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();
|
let sig = tcx.fn_sig(def_id).instantiate_identity();
|
||||||
// We accounted for the binder of the fn sig, so skip the binder.
|
// We accounted for the binder of the fn sig, so skip the binder.
|
||||||
|
|
|
@ -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() {}
|
|
@ -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`.
|
Loading…
Add table
Add a link
Reference in a new issue