authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-18 21:20:38+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-18 21:20:38+02:00
loge65b9e8f7bcc38943f48ed44560a22c62ca222ce
tree692c76e7a24331e71b2dec5f033993d97a4cd466
parent62bfff5e8774413856d0c548f0fd73a4b5134f7f
signature Commit is signed but in an unrecognized format.

translate-c-2 stmt expr


3 files changed, 71 insertions(+), 20 deletions(-)

src-self-hosted/clang.zig+3
......@@ -79,6 +79,7 @@ pub const ZigClangPreprocessingRecord = @OpaqueType();
7979pub const ZigClangFloatingLiteral = @OpaqueType();
8080pub const ZigClangConstantExpr = @OpaqueType();
8181pub const ZigClangCharacterLiteral = @OpaqueType();
82pub const ZigClangStmtExpr = @OpaqueType();
8283
8384pub const ZigClangBO = extern enum {
8485 PtrMemD,
......@@ -1095,3 +1096,5 @@ pub extern fn ZigClangCharacterLiteral_getBeginLoc(*const ZigClangCharacterLiter
10951096pub extern fn ZigClangCharacterLiteral_getKind(*const ZigClangCharacterLiteral) ZigClangCharacterLiteral_CharacterKind;
10961097pub extern fn ZigClangCharacterLiteral_getValue(*const ZigClangCharacterLiteral) c_uint;
10971098
1099pub extern fn ZigClangStmtExpr_getSubStmt( *const ZigClangStmtExpr) *const ZigClangCompoundStmt;
1100
src-self-hosted/translate_c.zig+34-4
......@@ -855,6 +855,7 @@ fn transStmt(
855855 .ConstantExprClass => return transConstantExpr(rp, scope, @ptrCast(*const ZigClangExpr, stmt), result_used),
856856 .PredefinedExprClass => return transPredefinedExpr(rp, scope, @ptrCast(*const ZigClangPredefinedExpr, stmt), result_used),
857857 .CharacterLiteralClass => return transCharLiteral(rp, scope, @ptrCast(*const ZigClangCharacterLiteral, stmt), result_used),
858 .StmtExprClass => return transStmtExpr(rp, scope, @ptrCast(*const ZigClangStmtExpr, stmt), result_used),
858859 else => {
859860 return revertAndWarn(
860861 rp,
......@@ -1165,12 +1166,9 @@ fn transImplicitCastExpr(
11651166 const src_type = getExprQualType(c, sub_expr);
11661167 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);
11671168 },
1168 .FunctionToPointerDecay, .ArrayToPointerDecay => {
1169 .LValueToRValue, .NoOp, .FunctionToPointerDecay, .ArrayToPointerDecay => {
11691170 return maybeSuppressResult(rp, scope, result_used, sub_expr_node);
11701171 },
1171 .LValueToRValue, .NoOp => {
1172 return transExpr(rp, scope, sub_expr, .used, .r_value);
1173 },
11741172 .NullToPointer => {
11751173 return try transCreateNodeNullLiteral(rp.c);
11761174 },
......@@ -1960,6 +1958,38 @@ fn transCharLiteral(
19601958 }
19611959}
19621960
1961fn transStmtExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangStmtExpr, used: ResultUsed) TransError!*ast.Node {
1962 const comp = ZigClangStmtExpr_getSubStmt(stmt);
1963 if (used == .unused) {
1964 return transCompoundStmt(rp, scope, comp);
1965 }
1966 const lparen = try appendToken(rp.c, .LParen, "(");
1967 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
1968 const block = try transCreateNodeBlock(rp.c, "blk");
1969 block_scope.block_node = block;
1970
1971 var it = ZigClangCompoundStmt_body_begin(comp);
1972 const end_it = ZigClangCompoundStmt_body_end(comp);
1973 while (it != end_it - 1) : (it += 1) {
1974 const result = try transStmt(rp, &block_scope.base, it[0], .unused, .r_value);
1975 if (result != &block.base)
1976 try block.statements.push(result);
1977 }
1978 const break_node = try transCreateNodeBreak(rp.c, "blk");
1979 break_node.rhs = try transStmt(rp, &block_scope.base, it[0], .used, .r_value);
1980 _ = try appendToken(rp.c, .Semicolon, ";");
1981 try block.statements.push(&break_node.base);
1982 block.rbrace = try appendToken(rp.c, .RBrace, "}");
1983 const rparen = try appendToken(rp.c, .RParen, ")");
1984 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);
1985 grouped_expr.* = .{
1986 .lparen = lparen,
1987 .expr = &block.base,
1988 .rparen = rparen,
1989 };
1990 return maybeSuppressResult(rp, scope, used, &grouped_expr.base);
1991}
1992
19631993fn transCPtrCast(
19641994 rp: RestorePoint,
19651995 loc: ZigClangSourceLocation,
test/translate_c.zig+34-16
......@@ -1476,6 +1476,24 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
14761476 \\}
14771477 });
14781478
1479 cases.add_2("statement expression",
1480 \\int foo(void) {
1481 \\ return ({
1482 \\ int a = 1;
1483 \\ a;
1484 \\ a;
1485 \\ });
1486 \\}
1487 , &[_][]const u8{
1488 \\pub export fn foo() c_int {
1489 \\ return (blk: {
1490 \\ var a: c_int = 1;
1491 \\ _ = a;
1492 \\ break :blk a;
1493 \\ });
1494 \\}
1495 });
1496
14791497 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
14801498
14811499 cases.addAllowWarnings("simple data types",
......@@ -1723,22 +1741,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17231741 \\}
17241742 });
17251743
1726 cases.addC("statement expression",
1727 \\int foo(void) {
1728 \\ return ({
1729 \\ int a = 1;
1730 \\ a;
1731 \\ });
1732 \\}
1733 , &[_][]const u8{
1734 \\pub export fn foo() c_int {
1735 \\ return x: {
1736 \\ var a: c_int = 1;
1737 \\ break :x a;
1738 \\ };
1739 \\}
1740 });
1741
17421744 cases.addC("__extension__ cast",
17431745 \\int foo(void) {
17441746 \\ return __extension__ 1;
......@@ -2609,4 +2611,20 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
26092611 \\ return (a & b) ^ (a | b);
26102612 \\}
26112613 });
2614
2615 cases.addC("statement expression",
2616 \\int foo(void) {
2617 \\ return ({
2618 \\ int a = 1;
2619 \\ a;
2620 \\ });
2621 \\}
2622 , &[_][]const u8{
2623 \\pub export fn foo() c_int {
2624 \\ return x: {
2625 \\ var a: c_int = 1;
2626 \\ break :x a;
2627 \\ };
2628 \\}
2629 });
26122630}