diff --git a/crates/codegen/src/class_decl.rs b/crates/codegen/src/class_decl.rs index 31ee22a..888a20c 100644 --- a/crates/codegen/src/class_decl.rs +++ b/crates/codegen/src/class_decl.rs @@ -232,7 +232,7 @@ impl ClassProcessedData { } fn emit_super_v_tests(&self, cg: &mut RustCodegen) { - cg.add_indentedln(&format!("const fn __test_vt() {{")); + cg.add_indentedln(&format!("fn __test_vt() {{")); cg.indent += 1; for (override_tier, _) in self.override_v_table.iter() { @@ -293,6 +293,19 @@ impl ClassProcessedData { } } + // Deref tests for override targets + if self.inherits.is_some() && !self.override_v_table.is_empty() { + cg.add_indentedln("let this: &Self = &unsafe { std::mem::MaybeUninit::::zeroed().assume_init() };"); + + for (override_tier, v) in &self.override_v_table { + if let Some(path) = &override_tier.0 { + cg.add_indentedln(&v.get_comment()); + // This forces the compiler to statically verify that &Self can Deref into &Target + cg.add_indentedln(&format!("let _: &{} = this;", path.get_rust())); + } + } + } + cg.indent -= 1; cg.add_indentedln("}"); }