aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/rust/typecheck/rust-hir-const-fold.cc34
-rw-r--r--gcc/rust/typecheck/rust-hir-const-fold.h37
-rw-r--r--gcc/testsuite/rust/compile/torture/.traits3.rs.swpbin0 -> 12288 bytes
-rw-r--r--gcc/testsuite/rust/compile/torture/array_const_fold.rs2
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
new file mode 100644
index 0000000..77d2aa1
--- /dev/null
+++ b/gcc/testsuite/rust/compile/torture/.traits3.rs.swp
Binary files differ
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