Don't project to RPITIT that has no default value
This commit is contained in:
parent
276b75a843
commit
7634c5916a
@ -344,8 +344,8 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::EarlyBinder<Ty<'_>>
|
|||||||
in_trait,
|
in_trait,
|
||||||
..
|
..
|
||||||
}) => {
|
}) => {
|
||||||
if in_trait {
|
if in_trait && !tcx.impl_defaultness(owner).has_value() {
|
||||||
assert!(tcx.impl_defaultness(owner).has_value());
|
span_bug!(tcx.def_span(def_id), "tried to get type of this RPITIT with no definition");
|
||||||
}
|
}
|
||||||
find_opaque_ty_constraints_for_rpit(tcx, def_id, owner)
|
find_opaque_ty_constraints_for_rpit(tcx, def_id, owner)
|
||||||
}
|
}
|
||||||
|
@ -2200,7 +2200,8 @@ fn confirm_impl_trait_in_trait_candidate<'tcx>(
|
|||||||
Err(guar) => return Progress::error(tcx, guar),
|
Err(guar) => return Progress::error(tcx, guar),
|
||||||
};
|
};
|
||||||
// We don't support specialization for RPITITs anyways... yet.
|
// We don't support specialization for RPITITs anyways... yet.
|
||||||
if !leaf_def.is_final() {
|
// Also don't try to project to an RPITIT that has no value
|
||||||
|
if !leaf_def.is_final() || !leaf_def.item.defaultness(tcx).has_value() {
|
||||||
return Progress { term: tcx.ty_error_misc().into(), obligations };
|
return Progress { term: tcx.ty_error_misc().into(), obligations };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
#![feature(return_position_impl_trait_in_trait)]
|
||||||
|
//~^ WARN the feature `return_position_impl_trait_in_trait` is incomplete
|
||||||
|
|
||||||
|
trait MyTrait {
|
||||||
|
fn foo(&self) -> impl Sized;
|
||||||
|
fn bar(&self) -> impl Sized;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MyTrait for i32 {
|
||||||
|
//~^ ERROR not all trait items implemented, missing: `foo`
|
||||||
|
fn bar(&self) -> impl Sized {
|
||||||
|
self.foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,21 @@
|
|||||||
|
warning: the feature `return_position_impl_trait_in_trait` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
--> $DIR/dont-project-to-rpitit-with-no-value.rs:1:12
|
||||||
|
|
|
||||||
|
LL | #![feature(return_position_impl_trait_in_trait)]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #91611 <https://github.com/rust-lang/rust/issues/91611> for more information
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
|
error[E0046]: not all trait items implemented, missing: `foo`
|
||||||
|
--> $DIR/dont-project-to-rpitit-with-no-value.rs:9:1
|
||||||
|
|
|
||||||
|
LL | fn foo(&self) -> impl Sized;
|
||||||
|
| ---------------------------- `foo` from trait
|
||||||
|
...
|
||||||
|
LL | impl MyTrait for i32 {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation
|
||||||
|
|
||||||
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0046`.
|
Loading…
x
Reference in New Issue
Block a user