Support building clone shims for arrays with generic size
This commit is contained in:
parent
539402cb0b
commit
fac8b4e21a
@ -308,10 +308,7 @@ fn build_clone_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, self_ty: Ty<'tcx>) -
|
||||
|
||||
match self_ty.kind() {
|
||||
_ if is_copy => builder.copy_shim(),
|
||||
ty::Array(ty, len) => {
|
||||
let len = len.eval_usize(tcx, param_env);
|
||||
builder.array_shim(dest, src, ty, len)
|
||||
}
|
||||
ty::Array(ty, len) => builder.array_shim(dest, src, ty, len),
|
||||
ty::Closure(_, substs) => {
|
||||
builder.tuple_like_shim(dest, src, substs.as_closure().upvar_tys())
|
||||
}
|
||||
@ -485,7 +482,13 @@ fn make_usize(&self, value: u64) -> Box<Constant<'tcx>> {
|
||||
}
|
||||
}
|
||||
|
||||
fn array_shim(&mut self, dest: Place<'tcx>, src: Place<'tcx>, ty: Ty<'tcx>, len: u64) {
|
||||
fn array_shim(
|
||||
&mut self,
|
||||
dest: Place<'tcx>,
|
||||
src: Place<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
len: &'tcx ty::Const<'tcx>,
|
||||
) {
|
||||
let tcx = self.tcx;
|
||||
let span = self.span;
|
||||
|
||||
@ -503,7 +506,11 @@ fn array_shim(&mut self, dest: Place<'tcx>, src: Place<'tcx>, ty: Ty<'tcx>, len:
|
||||
))),
|
||||
self.make_statement(StatementKind::Assign(box (
|
||||
end,
|
||||
Rvalue::Use(Operand::Constant(self.make_usize(len))),
|
||||
Rvalue::Use(Operand::Constant(box Constant {
|
||||
span: self.span,
|
||||
user_ty: None,
|
||||
literal: len,
|
||||
})),
|
||||
))),
|
||||
];
|
||||
self.block(inits, TerminatorKind::Goto { target: BasicBlock::new(1) }, false);
|
||||
|
@ -0,0 +1,13 @@
|
||||
// Checks that we can build a clone shim for array with generic size.
|
||||
// Regression test for issue #79269.
|
||||
//
|
||||
// build-pass
|
||||
// compile-flags: -Zmir-opt-level=2 -Zvalidate-mir
|
||||
#![feature(min_const_generics)]
|
||||
|
||||
#[derive(Clone)]
|
||||
struct Array<T, const N: usize>([T; N]);
|
||||
|
||||
fn main() {
|
||||
let _ = Array([0u32, 1u32, 2u32]).clone();
|
||||
}
|
Loading…
Reference in New Issue
Block a user