Skip to content

Commit a1a4506

Browse files
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 <[email protected]>
2 parents ec1e7c2 + bb32b21 commit a1a4506

File tree

4 files changed

+36
-1
lines changed

4 files changed

+36
-1
lines changed

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

+33-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,39 @@ ConstFoldArrayElems::visit (HIR::ArrayElemsValues &elems)
101101
void
102102
ConstFoldArrayElems::visit (HIR::ArrayElemsCopied &elems)
103103
{
104-
// TODO
104+
std::vector<unsigned long> indices;
105+
std::vector<Bexpression *> values;
106+
107+
TyTy::BaseType *tyty = nullptr;
108+
if (!tyctx->lookup_type (expr.get_mappings ().get_hirid (), &tyty))
109+
{
110+
rust_fatal_error (expr.get_locus (),
111+
"did not resolve type for array elems");
112+
return;
113+
}
114+
115+
Btype *btype = ConstFoldType::fold (tyty, ctx->get_backend ());
116+
Bexpression *elem = ConstFoldExpr::fold (elems.get_elem_to_copy ());
117+
118+
// num copies expr was already folded in rust-hir-type-check-expr; lookup the
119+
// earlier result
120+
Bexpression *num_copies_expr = ctx->get_backend ()->error_expression ();
121+
ctx->lookup_const (elems.get_num_copies_expr ()->get_mappings ().get_hirid (),
122+
&num_copies_expr);
123+
124+
size_t copies;
125+
bool ok = ctx->get_backend ()->const_size_cast (num_copies_expr, &copies);
126+
rust_assert (ok);
127+
128+
for (size_t i = 0; i < copies; i++)
129+
{
130+
indices.push_back (i);
131+
values.push_back (elem);
132+
}
133+
134+
folded
135+
= ctx->get_backend ()->array_constructor_expression (btype, indices, values,
136+
expr.get_locus ());
105137
}
106138

107139
} // namespace ConstFold
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const SIZE: usize = 14 + 2;
2+
const TEST: [i32; SIZE] = [2; SIZE];
3+
// { dg-warning "unused name" "" { target *-*-* } .-1 }

0 commit comments

Comments
 (0)