diff --git a/compiler/rustc_codegen_ssa/src/mir/block.rs b/compiler/rustc_codegen_ssa/src/mir/block.rs index 438bb133fd1d..0c7cd43eb27d 100644 --- a/compiler/rustc_codegen_ssa/src/mir/block.rs +++ b/compiler/rustc_codegen_ssa/src/mir/block.rs @@ -907,7 +907,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { llargs.push(data_ptr); continue; } - _ => span_bug!(span, "can't codegen a virtual call on {:?}", op), + _ => span_bug!(span, "can't codegen a virtual call on {:#?}", op), } } diff --git a/compiler/rustc_const_eval/src/interpret/cast.rs b/compiler/rustc_const_eval/src/interpret/cast.rs index 9beeb2d8b2c7..6831e53d0141 100644 --- a/compiler/rustc_const_eval/src/interpret/cast.rs +++ b/compiler/rustc_const_eval/src/interpret/cast.rs @@ -110,7 +110,18 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } DynStar => { - unimplemented!() + if let ty::Dynamic(data, _, ty::TraitObjectRepresentation::Sized) = cast_ty.kind() { + // Initial cast from sized to dyn trait + let vtable = self.get_vtable_ptr(src.layout.ty, data.principal())?; + let ptr = self.read_immediate(src)?.to_scalar(); + // FIXME(dyn-star): This should not use new_dyn_trait, but + // it does exactly the same thing (makes a scalar pair)... + // so maybe we should just duplicate/rename the function. + let val = Immediate::new_dyn_trait(ptr, vtable, &*self.tcx); + self.write_immediate(val, dest)?; + } else { + bug!() + } } } Ok(()) diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs index 240bead5494d..c0d21250c303 100644 --- a/compiler/rustc_middle/src/ty/layout.rs +++ b/compiler/rustc_middle/src/ty/layout.rs @@ -2545,15 +2545,9 @@ where } } - // dyn* + // dyn* (both fields are usize-sized) ty::Dynamic(_, _, TraitObjectRepresentation::Sized) => { - TyMaybeWithLayout::TyAndLayout( - tcx.layout_of( - ty::ParamEnv::reveal_all() - .and(tcx.mk_tup([tcx.types.usize, tcx.types.usize].into_iter())), - ) - .unwrap(), - ) + TyMaybeWithLayout::Ty(tcx.types.usize) } ty::Projection(_) diff --git a/src/test/ui/async-await/dyn-star-trait-const.rs b/src/test/ui/async-await/dyn-star-trait-const.rs index c4861de3606c..315bc1a27412 100644 --- a/src/test/ui/async-await/dyn-star-trait-const.rs +++ b/src/test/ui/async-await/dyn-star-trait-const.rs @@ -1,6 +1,6 @@ // run-pass -// ignore-test #![feature(async_fn_in_traits)] +#![allow(unused)] use std::fmt::Debug;