diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-10-18 08:53:50 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-18 08:53:50 +0000 |
commit | a1a450641004c45b78b76034161f7b2efb0eeb1f (patch) | |
tree | f03c62ff63b4b886ce0e5629b07e3c2b391462c3 /gcc/rust | |
parent | ec1e7c286802dd9de13ebc9fb25903130be6dddc (diff) | |
parent | bb32b21a2191dd05773502ef6ed47e7c87df8a71 (diff) | |
download | gcc-a1a450641004c45b78b76034161f7b2efb0eeb1f.zip gcc-a1a450641004c45b78b76034161f7b2efb0eeb1f.tar.gz gcc-a1a450641004c45b78b76034161f7b2efb0eeb1f.tar.bz2 |
Merge #748
748: Const fold ArrayElemsCopied r=philberty a=rodrigovalle
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.
Co-authored-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 |