Handle normalization failure in struct_tail_erasing_lifetimes

Fixes an ICE that occurred when the struct in question has an error
This commit is contained in:
Gurinder Singh 2024-05-01 09:29:33 +05:30
parent 90846015cc
commit 0c71c9d74b
3 changed files with 37 additions and 2 deletions

View File

@ -332,7 +332,22 @@ pub fn compute(
match *ty.kind() { match *ty.kind() {
ty::Ref(_, pointee, _) | ty::RawPtr(pointee, _) => { ty::Ref(_, pointee, _) | ty::RawPtr(pointee, _) => {
let non_zero = !ty.is_unsafe_ptr(); let non_zero = !ty.is_unsafe_ptr();
let tail = tcx.struct_tail_erasing_lifetimes(pointee, param_env);
let tail = tcx.struct_tail_with_normalize(
pointee,
|ty| match tcx.try_normalize_erasing_regions(param_env, ty) {
Ok(ty) => ty,
Err(_e) => {
if let Some(guar) = tcx.dcx().has_errors() {
Ty::new_error(tcx, guar)
} else {
bug!("normalization failed, but no errors reported");
}
}
},
|| {},
);
match tail.kind() { match tail.kind() {
ty::Param(_) | ty::Alias(ty::Projection | ty::Inherent, _) => { ty::Param(_) | ty::Alias(ty::Projection | ty::Inherent, _) => {
debug_assert!(tail.has_non_region_param()); debug_assert!(tail.has_non_region_param());

View File

@ -1,9 +1,10 @@
//@ known-bug: #113272
trait Trait { trait Trait {
type RefTarget; type RefTarget;
} }
impl Trait for () where Missing: Trait {} impl Trait for () where Missing: Trait {}
//~^ ERROR cannot find type `Missing` in this scope
//~| ERROR not all trait items implemented, missing: `RefTarget`
struct Other { struct Other {
data: <() as Trait>::RefTarget, data: <() as Trait>::RefTarget,

View File

@ -0,0 +1,19 @@
error[E0412]: cannot find type `Missing` in this scope
--> $DIR/ice-struct-tail-normalization-113272.rs:5:25
|
LL | impl Trait for () where Missing: Trait {}
| ^^^^^^^ not found in this scope
error[E0046]: not all trait items implemented, missing: `RefTarget`
--> $DIR/ice-struct-tail-normalization-113272.rs:5:1
|
LL | type RefTarget;
| -------------- `RefTarget` from trait
...
LL | impl Trait for () where Missing: Trait {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `RefTarget` in implementation
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0046, E0412.
For more information about an error, try `rustc --explain E0046`.