| 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 | 584 | PrefixOp op = node->data.prefix_op_expr.prefix_op; |
| 585 | 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 | 590 | if (!grouped) fprintf(ar->f, ")"); |
| 589 | 591 | break; |
| 590 | 592 | } |
| 591 | 593 | case NodeTypeAddrOfExpr: |
| 592 | 594 | { |
| 595 | if (!grouped) fprintf(ar->f, "("); | |
| 593 | 596 | fprintf(ar->f, "&"); |
| 594 | 597 | if (node->data.addr_of_expr.align_expr != nullptr) { |
| 595 | 598 | fprintf(ar->f, "align("); |
| ... | ... | @@ -617,6 +620,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { |
| 617 | 620 | } |
| 618 | 621 | |
| 619 | 622 | render_node_ungrouped(ar, node->data.addr_of_expr.op_expr); |
| 623 | if (!grouped) fprintf(ar->f, ")"); | |
| 620 | 624 | break; |
| 621 | 625 | } |
| 622 | 626 | case NodeTypeFnCallExpr: |
| ... | ... | @@ -625,7 +629,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { |
| 625 | 629 | fprintf(ar->f, "@"); |
| 626 | 630 | } |
| 627 | 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 | 633 | render_node_extra(ar, fn_ref_node, grouped); |
| 630 | 634 | fprintf(ar->f, "("); |
| 631 | 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 | 4061 | } |
| 4062 | 4062 | |
| 4063 | 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 | 4076 | return nullptr; |
| 4066 | 4077 | } |
| 4067 | 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 | 4089 | case CTokIdDot: |
| 4071 | 4090 | case CTokIdEOF: |
test/translate_c.zig+8-2| ... | ... | @@ -902,7 +902,7 @@ pub fn addCases(cases: &tests.TranslateCContext) { |
| 902 | 902 | \\} |
| 903 | 903 | , |
| 904 | 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 | 930 | \\pub fn foo() -> c_int { |
| 931 | 931 | \\ var x: c_int = 1234; |
| 932 | 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 | 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 | } |