diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-const-fold.cc | 34 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/.traits3.rs.swp | bin | 12288 -> 0 bytes | |||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/array_const_fold_1.rs (renamed from gcc/testsuite/rust/compile/torture/array_const_fold.rs) | 0 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/array_const_fold_2.rs | 3 |
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/rust/typecheck/rust-hir-const-fold.cc b/gcc/rust/typecheck/rust-hir-const-fold.cc index 0b46b69..e5bce07 100644 --- a/gcc/rust/typecheck/rust-hir-const-fold.cc +++ b/gcc/rust/typecheck/rust-hir-const-fold.cc @@ -101,7 +101,39 @@ ConstFoldArrayElems::visit (HIR::ArrayElemsValues &elems) void ConstFoldArrayElems::visit (HIR::ArrayElemsCopied &elems) { - // TODO + std::vector<unsigned long> indices; + std::vector<Bexpression *> values; + + TyTy::BaseType *tyty = nullptr; + if (!tyctx->lookup_type (expr.get_mappings ().get_hirid (), &tyty)) + { + rust_fatal_error (expr.get_locus (), + "did not resolve type for array elems"); + return; + } + + Btype *btype = ConstFoldType::fold (tyty, ctx->get_backend ()); + Bexpression *elem = ConstFoldExpr::fold (elems.get_elem_to_copy ()); + + // num copies expr was already folded in rust-hir-type-check-expr; lookup the + // earlier result + Bexpression *num_copies_expr = ctx->get_backend ()->error_expression (); + ctx->lookup_const (elems.get_num_copies_expr ()->get_mappings ().get_hirid (), + &num_copies_expr); + + size_t copies; + bool ok = ctx->get_backend ()->const_size_cast (num_copies_expr, &copies); + rust_assert (ok); + + for (size_t i = 0; i < copies; i++) + { + indices.push_back (i); + values.push_back (elem); + } + + folded + = ctx->get_backend ()->array_constructor_expression (btype, indices, values, + expr.get_locus ()); } } // namespace ConstFold diff --git a/gcc/testsuite/rust/compile/torture/.traits3.rs.swp b/gcc/testsuite/rust/compile/torture/.traits3.rs.swp Binary files differdeleted file mode 100644 index 77d2aa1..0000000 --- a/gcc/testsuite/rust/compile/torture/.traits3.rs.swp +++ /dev/null diff --git a/gcc/testsuite/rust/compile/torture/array_const_fold.rs b/gcc/testsuite/rust/compile/torture/array_const_fold_1.rs index e45c938..e45c938 100644 --- a/gcc/testsuite/rust/compile/torture/array_const_fold.rs +++ b/gcc/testsuite/rust/compile/torture/array_const_fold_1.rs diff --git a/gcc/testsuite/rust/compile/torture/array_const_fold_2.rs b/gcc/testsuite/rust/compile/torture/array_const_fold_2.rs new file mode 100644 index 0000000..b42a68e --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/array_const_fold_2.rs @@ -0,0 +1,3 @@ +const SIZE: usize = 14 + 2; +const TEST: [i32; SIZE] = [2; SIZE]; +// { dg-warning "unused name" "" { target *-*-* } .-1 } |