Skip to content

Commit ec1e7c2

Browse files
Merge #725
725: Add array constant folding r=philberty a=rodrigovalle Fixes #681 I created a new ConstFoldArrayElems folder to visit ArrayElemsCopied and ArrayElemsValues while holding onto the original ArrayExpr object that we recurse into. Co-authored-by: Rodrigo Valle <[email protected]>
2 parents b5e3892 + 14a0f2c commit ec1e7c2

File tree

4 files changed

+72
-1
lines changed

4 files changed

+72
-1
lines changed

gcc/rust/typecheck/rust-hir-const-fold.cc

+34
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,39 @@ ConstFoldItem::visit (HIR::ConstantItem &item)
7070
folded = folded_expr;
7171
}
7272

73+
void
74+
ConstFoldArrayElems::visit (HIR::ArrayElemsValues &elems)
75+
{
76+
unsigned long index = 0;
77+
std::vector<unsigned long> indices;
78+
std::vector<Bexpression *> values;
79+
80+
TyTy::BaseType *tyty = nullptr;
81+
if (!tyctx->lookup_type (expr.get_mappings ().get_hirid (), &tyty))
82+
{
83+
rust_fatal_error (expr.get_locus (),
84+
"did not resolve type for array elems values");
85+
return;
86+
}
87+
88+
Btype *btype = ConstFoldType::fold (tyty, ctx->get_backend ());
89+
90+
for (auto &value : elems.get_values ())
91+
{
92+
indices.push_back (index++);
93+
values.push_back (ConstFoldExpr::fold (value.get ()));
94+
}
95+
96+
folded
97+
= ctx->get_backend ()->array_constructor_expression (btype, indices, values,
98+
expr.get_locus ());
99+
}
100+
101+
void
102+
ConstFoldArrayElems::visit (HIR::ArrayElemsCopied &elems)
103+
{
104+
// TODO
105+
}
106+
73107
} // namespace ConstFold
74108
} // namespace Rust

gcc/rust/typecheck/rust-hir-const-fold.h

+36-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ class ConstFoldType : public TyTy::TyVisitor
4141

4242
void visit (TyTy::ADTType &) override { gcc_unreachable (); }
4343

44-
void visit (TyTy::ArrayType &) override { gcc_unreachable (); }
44+
void visit (TyTy::ArrayType &type) override
45+
{
46+
Btype *element_ty = ConstFoldType::fold (type.get_element_type (), backend);
47+
translated = backend->array_type (element_ty, type.get_capacity ());
48+
}
4549

4650
void visit (TyTy::ReferenceType &) override { gcc_unreachable (); }
4751

@@ -233,6 +237,32 @@ class ConstFoldItem : public ConstFoldBase
233237
Bexpression *folded;
234238
};
235239

240+
class ConstFoldArrayElems : public ConstFoldBase
241+
{
242+
using ConstFoldBase::visit;
243+
244+
public:
245+
static Bexpression *fold (HIR::ArrayExpr &expr)
246+
{
247+
ConstFoldArrayElems folder (expr);
248+
HIR::ArrayElems *elems = expr.get_internal_elements ();
249+
elems->accept_vis (folder);
250+
return folder.folded;
251+
}
252+
253+
void visit (HIR::ArrayElemsValues &elems) override;
254+
void visit (HIR::ArrayElemsCopied &elems) override;
255+
256+
private:
257+
ConstFoldArrayElems (HIR::ArrayExpr &expr)
258+
: ConstFoldBase (), folded (ctx->get_backend ()->error_expression ()),
259+
expr (expr)
260+
{}
261+
262+
Bexpression *folded;
263+
HIR::ArrayExpr &expr;
264+
};
265+
236266
class ConstFoldExpr : public ConstFoldBase
237267
{
238268
using ConstFoldBase::visit;
@@ -361,6 +391,11 @@ class ConstFoldExpr : public ConstFoldBase
361391
gcc_unreachable ();
362392
}
363393

394+
void visit (HIR::ArrayExpr &expr) override
395+
{
396+
folded = ConstFoldArrayElems::fold (expr);
397+
}
398+
364399
void visit (HIR::ArithmeticOrLogicalExpr &expr) override
365400
{
366401
auto lhs = ConstFoldExpr::fold (expr.get_lhs ());
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
const TEST: [i32; 16] = [2, 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8];
2+
// { dg-warning "unused name" "" { target *-*-* } .-1 }

0 commit comments

Comments
 (0)