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:
parent
90846015cc
commit
0c71c9d74b
@ -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());
|
||||||
|
@ -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,
|
19
tests/ui/structs/ice-struct-tail-normalization-113272.stderr
Normal file
19
tests/ui/structs/ice-struct-tail-normalization-113272.stderr
Normal 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`.
|
Loading…
Reference in New Issue
Block a user