diff options
author | Rodrigo Valle <rdan.valle@gmail.com> | 2021-10-11 00:22:15 -0700 |
---|---|---|
committer | Rodrigo Valle <rdan.valle@gmail.com> | 2021-10-17 20:06:02 -0700 |
commit | bb32b21a2191dd05773502ef6ed47e7c87df8a71 (patch) | |
tree | f03c62ff63b4b886ce0e5629b07e3c2b391462c3 /gcc/rust | |
parent | ec1e7c286802dd9de13ebc9fb25903130be6dddc (diff) | |
download | gcc-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/rust')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-const-fold.cc | 34 |
1 files changed, 33 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 |