authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-12-07 12:27:29-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-12-07 12:27:29-05:00
log182cf5b8de375080bff6f2bb91cd398e776da16c
tree51f15ba9cd46ac43efe16bf948594dc220ad6b02
parentdc502042d58ccfb3ad05d68c865a9079fe9015ec

translate-c: support macros with pointer casting


3 files changed, 35 insertions(+), 6 deletions(-)

src/ast_render.cpp+6-2
...@@ -584,12 +584,15 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {...@@ -584,12 +584,15 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
584 PrefixOp op = node->data.prefix_op_expr.prefix_op;584 PrefixOp op = node->data.prefix_op_expr.prefix_op;
585 fprintf(ar->f, "%s", prefix_op_str(op));585 fprintf(ar->f, "%s", prefix_op_str(op));
586586
587 render_node_ungrouped(ar, node->data.prefix_op_expr.primary_expr);587 AstNode *child_node = node->data.prefix_op_expr.primary_expr;
588 bool new_grouped = child_node->type == NodeTypePrefixOpExpr || child_node->type == NodeTypeAddrOfExpr;
589 render_node_extra(ar, child_node, new_grouped);
588 if (!grouped) fprintf(ar->f, ")");590 if (!grouped) fprintf(ar->f, ")");
589 break;591 break;
590 }592 }
591 case NodeTypeAddrOfExpr:593 case NodeTypeAddrOfExpr:
592 {594 {
595 if (!grouped) fprintf(ar->f, "(");
593 fprintf(ar->f, "&");596 fprintf(ar->f, "&");
594 if (node->data.addr_of_expr.align_expr != nullptr) {597 if (node->data.addr_of_expr.align_expr != nullptr) {
595 fprintf(ar->f, "align(");598 fprintf(ar->f, "align(");
...@@ -617,6 +620,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {...@@ -617,6 +620,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
617 }620 }
618621
619 render_node_ungrouped(ar, node->data.addr_of_expr.op_expr);622 render_node_ungrouped(ar, node->data.addr_of_expr.op_expr);
623 if (!grouped) fprintf(ar->f, ")");
620 break;624 break;
621 }625 }
622 case NodeTypeFnCallExpr:626 case NodeTypeFnCallExpr:
...@@ -625,7 +629,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {...@@ -625,7 +629,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
625 fprintf(ar->f, "@");629 fprintf(ar->f, "@");
626 }630 }
627 AstNode *fn_ref_node = node->data.fn_call_expr.fn_ref_expr;631 AstNode *fn_ref_node = node->data.fn_call_expr.fn_ref_expr;
628 bool grouped = (fn_ref_node->type != NodeTypePrefixOpExpr);632 bool grouped = (fn_ref_node->type != NodeTypePrefixOpExpr && fn_ref_node->type != NodeTypeAddrOfExpr);
629 render_node_extra(ar, fn_ref_node, grouped);633 render_node_extra(ar, fn_ref_node, grouped);
630 fprintf(ar->f, "(");634 fprintf(ar->f, "(");
631 for (size_t i = 0; i < node->data.fn_call_expr.params.length; i += 1) {635 for (size_t i = 0; i < node->data.fn_call_expr.params.length; i += 1) {
src/translate_c.cpp+21-2
...@@ -4061,11 +4061,30 @@ static AstNode *parse_ctok_primary_expr(Context *c, CTokenize *ctok, size_t *tok...@@ -4061,11 +4061,30 @@ static AstNode *parse_ctok_primary_expr(Context *c, CTokenize *ctok, size_t *tok
4061 }4061 }
40624062
4063 CTok *next_tok = &ctok->tokens.at(*tok_i);4063 CTok *next_tok = &ctok->tokens.at(*tok_i);
4064 if (next_tok->id != CTokIdRParen) {4064 if (next_tok->id == CTokIdRParen) {
4065 *tok_i += 1;
4066 return inner_node;
4067 }
4068
4069 AstNode *node_to_cast = parse_ctok_expr(c, ctok, tok_i);
4070 if (node_to_cast == nullptr) {
4071 return nullptr;
4072 }
4073
4074 CTok *next_tok2 = &ctok->tokens.at(*tok_i);
4075 if (next_tok2->id != CTokIdRParen) {
4065 return nullptr;4076 return nullptr;
4066 }4077 }
4067 *tok_i += 1;4078 *tok_i += 1;
4068 return inner_node;4079
4080 if (inner_node->type == NodeTypeAddrOfExpr) {
4081 AstNode *call_node = trans_create_node_builtin_fn_call_str(c, "ptrCast");
4082 call_node->data.fn_call_expr.params.append(inner_node);
4083 call_node->data.fn_call_expr.params.append(node_to_cast);
4084 return call_node;
4085 } else {
4086 return trans_create_node_cast(c, inner_node, node_to_cast);
4087 }
4069 }4088 }
4070 case CTokIdDot:4089 case CTokIdDot:
4071 case CTokIdEOF:4090 case CTokIdEOF:
test/translate_c.zig+8-2
...@@ -902,7 +902,7 @@ pub fn addCases(cases: &tests.TranslateCContext) {...@@ -902,7 +902,7 @@ pub fn addCases(cases: &tests.TranslateCContext) {
902 \\}902 \\}
903 ,903 ,
904 \\export fn foo(x: ?&c_int) {904 \\export fn foo(x: ?&c_int) {
905 \\ (*(??x)) = 1;905 \\ (*??x) = 1;
906 \\}906 \\}
907 );907 );
908908
...@@ -930,7 +930,7 @@ pub fn addCases(cases: &tests.TranslateCContext) {...@@ -930,7 +930,7 @@ pub fn addCases(cases: &tests.TranslateCContext) {
930 \\pub fn foo() -> c_int {930 \\pub fn foo() -> c_int {
931 \\ var x: c_int = 1234;931 \\ var x: c_int = 1234;
932 \\ var ptr: ?&c_int = &x;932 \\ var ptr: ?&c_int = &x;
933 \\ return *(??ptr);933 \\ return *??ptr;
934 \\}934 \\}
935 );935 );
936936
...@@ -1188,4 +1188,10 @@ pub fn addCases(cases: &tests.TranslateCContext) {...@@ -1188,4 +1188,10 @@ pub fn addCases(cases: &tests.TranslateCContext) {
1188 \\ const v2: &const u8 = c"2.2.2";1188 \\ const v2: &const u8 = c"2.2.2";
1189 \\}1189 \\}
1190 );1190 );
1191
1192 cases.add("macro pointer cast",
1193 \\#define NRF_GPIO ((NRF_GPIO_Type *) NRF_GPIO_BASE)
1194 ,
1195 \\pub const NRF_GPIO = @ptrCast(&NRF_GPIO_Type, NRF_GPIO_BASE);
1196 );
1191}1197}