Skip to content

Commit 03148ff

Browse files
compiler-errorseholk
authored andcommitted
Make dyn-trait-method work
1 parent b2ed2dc commit 03148ff

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

compiler/rustc_codegen_ssa/src/mir/block.rs

+24-1
Original file line numberDiff line numberDiff line change
@@ -907,7 +907,30 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
907907
llargs.push(data_ptr);
908908
continue;
909909
}
910-
_ => span_bug!(span, "can't codegen a virtual call on {:#?}", op),
910+
Immediate(_) => {
911+
let ty::Ref(_, ty, _) = op.layout.ty.kind() else {
912+
span_bug!(span, "can't codegen a virtual call on {:#?}", op);
913+
};
914+
if !ty.is_dyn_star() {
915+
span_bug!(span, "can't codegen a virtual call on {:#?}", op);
916+
}
917+
// FIXME(dyn-star): Make sure this is done on a &dyn* receiver
918+
let place = op.deref(bx.cx());
919+
let data_ptr = place.project_field(&mut bx, 0);
920+
let meta_ptr = place.project_field(&mut bx, 1);
921+
let meta = bx.load_operand(meta_ptr);
922+
llfn = Some(meth::VirtualIndex::from_index(idx).get_fn(
923+
&mut bx,
924+
meta.immediate(),
925+
op.layout.ty,
926+
&fn_abi,
927+
));
928+
llargs.push(data_ptr.llval);
929+
continue;
930+
}
931+
_ => {
932+
span_bug!(span, "can't codegen a virtual call on {:#?}", op);
933+
}
911934
}
912935
}
913936

compiler/rustc_middle/src/ty/layout.rs

+16-3
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
626626
}
627627

628628
ty::Dynamic(_, _, ty::DynStar) => {
629-
let mut pointer = scalar_unit(Pointer);
629+
let mut pointer = scalar_unit(Int(dl.ptr_sized_integer(), false));
630630
pointer.valid_range_mut().start = 1;
631631
let mut vtable = scalar_unit(Pointer);
632632
vtable.valid_range_mut().start = 1;
@@ -2544,8 +2544,21 @@ where
25442544
}
25452545
}
25462546

2547-
// dyn* (both fields are usize-sized)
2548-
ty::Dynamic(_, _, ty::DynStar) => TyMaybeWithLayout::Ty(tcx.types.usize),
2547+
ty::Dynamic(_, _, ty::DynStar) => {
2548+
if i == 0 {
2549+
TyMaybeWithLayout::Ty(tcx.types.usize)
2550+
} else if i == 1 {
2551+
// FIXME(dyn-star) same FIXME as above applies here too
2552+
TyMaybeWithLayout::Ty(
2553+
tcx.mk_imm_ref(
2554+
tcx.lifetimes.re_static,
2555+
tcx.mk_array(tcx.types.usize, 3),
2556+
),
2557+
)
2558+
} else {
2559+
bug!("no field {i} on dyn*")
2560+
}
2561+
}
25492562

25502563
ty::Projection(_)
25512564
| ty::Bound(..)

0 commit comments

Comments
 (0)