diff options
-rw-r--r-- | gcc/rust/typecheck/rust-hir-const-fold.cc | 34 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-const-fold.h | 37 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/.traits3.rs.swp | bin | 0 -> 12288 bytes | |||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/array_const_fold.rs | 2 |
4 files changed, 72 insertions, 1 deletions
diff --git a/gcc/rust/typecheck/rust-hir-const-fold.cc b/gcc/rust/typecheck/rust-hir-const-fold.cc index ecad200..0b46b69 100644 --- a/gcc/rust/typecheck/rust-hir-const-fold.cc +++ b/gcc/rust/typecheck/rust-hir-const-fold.cc @@ -70,5 +70,39 @@ ConstFoldItem::visit (HIR::ConstantItem &item) folded = folded_expr; } +void +ConstFoldArrayElems::visit (HIR::ArrayElemsValues &elems) +{ + unsigned long index = 0; + 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 values"); + return; + } + + Btype *btype = ConstFoldType::fold (tyty, ctx->get_backend ()); + + for (auto &value : elems.get_values ()) + { + indices.push_back (index++); + values.push_back (ConstFoldExpr::fold (value.get ())); + } + + folded + = ctx->get_backend ()->array_constructor_expression (btype, indices, values, + expr.get_locus ()); +} + +void +ConstFoldArrayElems::visit (HIR::ArrayElemsCopied &elems) +{ + // TODO +} + } // namespace ConstFold } // namespace Rust diff --git a/gcc/rust/typecheck/rust-hir-const-fold.h b/gcc/rust/typecheck/rust-hir-const-fold.h index d8fbd8d..788e5cb 100644 --- a/gcc/rust/typecheck/rust-hir-const-fold.h +++ b/gcc/rust/typecheck/rust-hir-const-fold.h @@ -41,7 +41,11 @@ public: void visit (TyTy::ADTType &) override { gcc_unreachable (); } - void visit (TyTy::ArrayType &) override { gcc_unreachable (); } + void visit (TyTy::ArrayType &type) override + { + Btype *element_ty = ConstFoldType::fold (type.get_element_type (), backend); + translated = backend->array_type (element_ty, type.get_capacity ()); + } void visit (TyTy::ReferenceType &) override { gcc_unreachable (); } @@ -233,6 +237,32 @@ private: Bexpression *folded; }; +class ConstFoldArrayElems : public ConstFoldBase +{ + using ConstFoldBase::visit; + +public: + static Bexpression *fold (HIR::ArrayExpr &expr) + { + ConstFoldArrayElems folder (expr); + HIR::ArrayElems *elems = expr.get_internal_elements (); + elems->accept_vis (folder); + return folder.folded; + } + + void visit (HIR::ArrayElemsValues &elems) override; + void visit (HIR::ArrayElemsCopied &elems) override; + +private: + ConstFoldArrayElems (HIR::ArrayExpr &expr) + : ConstFoldBase (), folded (ctx->get_backend ()->error_expression ()), + expr (expr) + {} + + Bexpression *folded; + HIR::ArrayExpr &expr; +}; + class ConstFoldExpr : public ConstFoldBase { using ConstFoldBase::visit; @@ -361,6 +391,11 @@ public: gcc_unreachable (); } + void visit (HIR::ArrayExpr &expr) override + { + folded = ConstFoldArrayElems::fold (expr); + } + void visit (HIR::ArithmeticOrLogicalExpr &expr) override { auto lhs = ConstFoldExpr::fold (expr.get_lhs ()); diff --git a/gcc/testsuite/rust/compile/torture/.traits3.rs.swp b/gcc/testsuite/rust/compile/torture/.traits3.rs.swp Binary files differnew file mode 100644 index 0000000..77d2aa1 --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/.traits3.rs.swp diff --git a/gcc/testsuite/rust/compile/torture/array_const_fold.rs b/gcc/testsuite/rust/compile/torture/array_const_fold.rs new file mode 100644 index 0000000..e45c938 --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/array_const_fold.rs @@ -0,0 +1,2 @@ +const TEST: [i32; 16] = [2, 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8]; +// { dg-warning "unused name" "" { target *-*-* } .-1 }
\ No newline at end of file |