aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRodrigo Valle <rdan.valle@gmail.com>2021-10-11 00:22:15 -0700
committerRodrigo Valle <rdan.valle@gmail.com>2021-10-17 20:06:02 -0700
commitbb32b21a2191dd05773502ef6ed47e7c87df8a71 (patch)
treef03c62ff63b4b886ce0e5629b07e3c2b391462c3 /gcc
parentec1e7c286802dd9de13ebc9fb25903130be6dddc (diff)
downloadgcc-bb32b21a2191dd05773502ef6ed47e7c87df8a71.zip
gcc-bb32b21a2191dd05773502ef6ed47e7c87df8a71.tar.gz
gcc-bb32b21a2191dd05773502ef6ed47e7c87df8a71.tar.bz2
Const fold ArrayElemsCopied
Added support for const fold inside of an ArrayElemsCopied expression, e.g. `const array: [i32; 10] = [0; 10];`. I also removed a .swp file that I accidentally merged in a previous commit and added a test for this new functionality. Signed-off-by: Rodrigo Valle <rdan.valle@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-hir-const-fold.cc34
-rw-r--r--gcc/testsuite/rust/compile/torture/.traits3.rs.swpbin12288 -> 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.rs3
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
deleted file mode 100644
index 77d2aa1..0000000
--- a/gcc/testsuite/rust/compile/torture/.traits3.rs.swp
+++ /dev/null
Binary files differ
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 }