Skip to content

Commit

Permalink
Support building clone shims for arrays with generic size
Browse files Browse the repository at this point in the history
  • Loading branch information
tmiasko committed Nov 21, 2020
1 parent 539402c commit fac8b4e
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 6 deletions.
19 changes: 13 additions & 6 deletions compiler/rustc_mir/src/shim.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}
Expand Down Expand Up @@ -485,7 +482,13 @@ impl CloneShimBuilder<'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;

Expand All @@ -503,7 +506,11 @@ impl CloneShimBuilder<'tcx> {
))),
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);
Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs
Original file line number Diff line number Diff line change
@@ -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();
}

0 comments on commit fac8b4e

Please sign in to comment.