| author | |
| committer | |
| log | 182cf5b8de375080bff6f2bb91cd398e776da16c |
| tree | 51f15ba9cd46ac43efe16bf948594dc220ad6b02 |
| parent | dc502042d58ccfb3ad05d68c865a9079fe9015ec |
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)); |
| 586 | 586 | ||
| 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 | } |
| 618 | 621 | ||
| 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 | } |
| 4062 | 4062 | ||
| 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 | ); |
| 908 | 908 | ||
| ... | @@ -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 | ); |
| 936 | 936 | ||
| ... | @@ -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 | } |