Layout of &dyn Trait<[type error]> is still wide

This commit is contained in:
Michael Goulet 2023-03-13 21:35:15 +00:00
parent f1b1ed7e18
commit 0bb876ebe7
4 changed files with 32 additions and 2 deletions

View File

@ -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]),

View File

@ -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]),

View File

@ -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(()) };
}

View File

@ -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`.