about summary refs log tree commit diff
path: root/compiler/rustc_const_eval
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2022-08-29 03:24:30 +0000
committerEric Holk <ericholk@microsoft.com>2022-09-12 16:55:59 -0700
commit12ec2f0e34e230a5d95d7ef06c6de92efcdcbedf (patch)
tree9473b38dfac7be6716b52e839d3182dacf72cb04 /compiler/rustc_const_eval
parent12353c11ca2848c15511d3b3d400fca412daff7b (diff)
downloadrust-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.rs13
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(())