diff options
| author | Michael Goulet <michael@errs.io> | 2022-08-29 03:24:30 +0000 |
|---|---|---|
| committer | Eric Holk <ericholk@microsoft.com> | 2022-09-12 16:55:59 -0700 |
| commit | 12ec2f0e34e230a5d95d7ef06c6de92efcdcbedf (patch) | |
| tree | 9473b38dfac7be6716b52e839d3182dacf72cb04 /compiler/rustc_const_eval | |
| parent | 12353c11ca2848c15511d3b3d400fca412daff7b (diff) | |
| download | rust-12ec2f0e34e230a5d95d7ef06c6de92efcdcbedf.tar.gz rust-12ec2f0e34e230a5d95d7ef06c6de92efcdcbedf.zip | |
Construct dyn* during const interp
Diffstat (limited to 'compiler/rustc_const_eval')
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/cast.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/compiler/rustc_const_eval/src/interpret/cast.rs b/compiler/rustc_const_eval/src/interpret/cast.rs index 9beeb2d8b2c..6831e53d014 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(()) |
