mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
Generate compilable code for array inits
The compiler still doesn't like too much the newfangled anonymous arrays so let's use the old-style declarations. Closes #4181
This commit is contained in:
parent
cbd42e44d6
commit
c944865fc7
2 changed files with 50 additions and 6 deletions
|
|
@ -1991,6 +1991,29 @@ fn transInitListExprRecord(
|
||||||
return &init_node.base;
|
return &init_node.base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn transCreateNodeArrayType(
|
||||||
|
rp: RestorePoint,
|
||||||
|
source_loc: ZigClangSourceLocation,
|
||||||
|
ty: *const ZigClangType,
|
||||||
|
len: var,
|
||||||
|
) TransError!*ast.Node {
|
||||||
|
var node = try transCreateNodePrefixOp(
|
||||||
|
rp.c,
|
||||||
|
.{
|
||||||
|
.ArrayType = .{
|
||||||
|
.len_expr = undefined,
|
||||||
|
.sentinel = null,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.LBracket,
|
||||||
|
"[",
|
||||||
|
);
|
||||||
|
node.op.ArrayType.len_expr = try transCreateNodeInt(rp.c, len);
|
||||||
|
_ = try appendToken(rp.c, .RBracket, "]");
|
||||||
|
node.rhs = try transType(rp, ty, source_loc);
|
||||||
|
return &node.base;
|
||||||
|
}
|
||||||
|
|
||||||
fn transInitListExprArray(
|
fn transInitListExprArray(
|
||||||
rp: RestorePoint,
|
rp: RestorePoint,
|
||||||
scope: *Scope,
|
scope: *Scope,
|
||||||
|
|
@ -2011,8 +2034,13 @@ fn transInitListExprArray(
|
||||||
var init_node: *ast.Node.SuffixOp = undefined;
|
var init_node: *ast.Node.SuffixOp = undefined;
|
||||||
var cat_tok: ast.TokenIndex = undefined;
|
var cat_tok: ast.TokenIndex = undefined;
|
||||||
if (init_count != 0) {
|
if (init_count != 0) {
|
||||||
const dot_tok = try appendToken(rp.c, .Period, ".");
|
const ty_node = try transCreateNodeArrayType(
|
||||||
init_node = try transCreateNodeContainerInitializer(rp.c, dot_tok);
|
rp,
|
||||||
|
loc,
|
||||||
|
ZigClangQualType_getTypePtr(child_qt),
|
||||||
|
init_count,
|
||||||
|
);
|
||||||
|
init_node = try transCreateNodeArrayInitializer(rp.c, ty_node);
|
||||||
var i: c_uint = 0;
|
var i: c_uint = 0;
|
||||||
while (i < init_count) : (i += 1) {
|
while (i < init_count) : (i += 1) {
|
||||||
const elem_expr = ZigClangInitListExpr_getInit(expr, i);
|
const elem_expr = ZigClangInitListExpr_getInit(expr, i);
|
||||||
|
|
@ -2026,8 +2054,8 @@ fn transInitListExprArray(
|
||||||
cat_tok = try appendToken(rp.c, .PlusPlus, "++");
|
cat_tok = try appendToken(rp.c, .PlusPlus, "++");
|
||||||
}
|
}
|
||||||
|
|
||||||
const dot_tok = try appendToken(rp.c, .Period, ".");
|
const ty_node = try transCreateNodeArrayType(rp, loc, ZigClangQualType_getTypePtr(child_qt), 1);
|
||||||
var filler_init_node = try transCreateNodeContainerInitializer(rp.c, dot_tok);
|
var filler_init_node = try transCreateNodeArrayInitializer(rp.c, ty_node);
|
||||||
const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr);
|
const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr);
|
||||||
try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value));
|
try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value));
|
||||||
filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
|
filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
|
||||||
|
|
@ -3878,11 +3906,11 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {
|
||||||
return &node.base;
|
return &node.base;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn transCreateNodeContainerInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.Node.SuffixOp {
|
fn transCreateNodeArrayInitializer(c: *Context, ty: *ast.Node) !*ast.Node.SuffixOp {
|
||||||
_ = try appendToken(c, .LBrace, "{");
|
_ = try appendToken(c, .LBrace, "{");
|
||||||
const node = try c.a().create(ast.Node.SuffixOp);
|
const node = try c.a().create(ast.Node.SuffixOp);
|
||||||
node.* = ast.Node.SuffixOp{
|
node.* = ast.Node.SuffixOp{
|
||||||
.lhs = .{ .dot = dot_tok },
|
.lhs = .{ .node = ty },
|
||||||
.op = .{
|
.op = .{
|
||||||
.ArrayInitializer = ast.Node.SuffixOp.Op.InitList.init(c.a()),
|
.ArrayInitializer = ast.Node.SuffixOp.Op.InitList.init(c.a()),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,22 @@ const tests = @import("tests.zig");
|
||||||
const nl = std.cstr.line_sep;
|
const nl = std.cstr.line_sep;
|
||||||
|
|
||||||
pub fn addCases(cases: *tests.RunTranslatedCContext) void {
|
pub fn addCases(cases: *tests.RunTranslatedCContext) void {
|
||||||
|
cases.add("array initializer",
|
||||||
|
\\#include <stdlib.h>
|
||||||
|
\\int main(int argc, char **argv) {
|
||||||
|
\\ int a0[4] = {1};
|
||||||
|
\\ int a1[4] = {1,2,3,4};
|
||||||
|
\\ int s0 = 0, s1 = 0;
|
||||||
|
\\ for (int i = 0; i < 4; i++) {
|
||||||
|
\\ s0 += a0[i];
|
||||||
|
\\ s1 += a1[i];
|
||||||
|
\\ }
|
||||||
|
\\ if (s0 != 1) abort();
|
||||||
|
\\ if (s1 != 10) abort();
|
||||||
|
\\ return 0;
|
||||||
|
\\}
|
||||||
|
, "");
|
||||||
|
|
||||||
cases.add("forward declarations",
|
cases.add("forward declarations",
|
||||||
\\#include <stdlib.h>
|
\\#include <stdlib.h>
|
||||||
\\int foo(int);
|
\\int foo(int);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue