Skip to content

Commit

Permalink
Rollup merge of #109101 - compiler-errors:layout-err, r=michaelwoerister
Browse files Browse the repository at this point in the history
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
  • Loading branch information
matthiaskrgr authored Mar 14, 2023
2 parents 21d15db + 0bb876e commit 1f159b4
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 2 deletions.
6 changes: 5 additions & 1 deletion compiler/rustc_middle/src/ty/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,11 @@ where
*/
};

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 = tcx.normalize_erasing_regions(
cx.param_env(),
tcx.mk_projection(metadata_def_id, [pointee]),
Expand Down
6 changes: 5 additions & 1 deletion compiler/rustc_ty_utils/src/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]),
Expand Down
8 changes: 8 additions & 0 deletions tests/ui/layout/transmute-to-tail-with-err.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
trait Trait<T> {}

struct Bar(Box<dyn Trait<T>>);
//~^ ERROR cannot find type `T` in this scope

fn main() {
let x: Bar = unsafe { std::mem::transmute(()) };
}
14 changes: 14 additions & 0 deletions tests/ui/layout/transmute-to-tail-with-err.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0412]: cannot find type `T` in this scope
--> $DIR/transmute-to-tail-with-err.rs:3:26
|
LL | struct Bar(Box<dyn Trait<T>>);
| ^ not found in this scope
|
help: you might be missing a type parameter
|
LL | struct Bar<T>(Box<dyn Trait<T>>);
| +++

error: aborting due to previous error

For more information about this error, try `rustc --explain E0412`.

0 comments on commit 1f159b4

Please sign in to comment.