diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-03-14 17:40:05 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-14 17:40:05 +0100 |
| commit | 1f159b4894fe25d7d180dc32fa57a4d71a2b9a57 (patch) | |
| tree | ad133be471c24a0b1a3e1a14d30f97b539566846 /compiler/rustc_ty_utils/src | |
| parent | 21d15db1dff058ad0b3955ce4d5aef6d0e64c67c (diff) | |
| parent | 0bb876ebe76dee4c3f00fcd3c581d87ad67940ef (diff) | |
| download | rust-1f159b4894fe25d7d180dc32fa57a4d71a2b9a57.tar.gz rust-1f159b4894fe25d7d180dc32fa57a4d71a2b9a57.zip | |
Rollup merge of #109101 - compiler-errors:layout-err, r=michaelwoerister
Fall back to old metadata computation when type references errors Projection is a bit too aggressive normalizing `<dyn Trait<[type error]> as Pointee>::Metadata` to `[type error]`, rather than to `DynMetadata<..>`. Side-step that by just falling back to the old structural metadata computation. Fixes #109078
Diffstat (limited to 'compiler/rustc_ty_utils/src')
| -rw-r--r-- | compiler/rustc_ty_utils/src/layout.rs | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/compiler/rustc_ty_utils/src/layout.rs b/compiler/rustc_ty_utils/src/layout.rs index e3132fcc4c4..1788f544a7f 100644 --- a/compiler/rustc_ty_utils/src/layout.rs +++ b/compiler/rustc_ty_utils/src/layout.rs @@ -156,7 +156,11 @@ fn layout_of_uncached<'tcx>( let unsized_part = tcx.struct_tail_erasing_lifetimes(pointee, param_env); - let metadata = if let Some(metadata_def_id) = tcx.lang_items().metadata_type() { + let metadata = if let Some(metadata_def_id) = tcx.lang_items().metadata_type() + // Projection eagerly bails out when the pointee references errors, + // fall back to structurally deducing metadata. + && !pointee.references_error() + { let metadata_ty = tcx.normalize_erasing_regions( param_env, tcx.mk_projection(metadata_def_id, [pointee]), |
