| ... | @@ -2237,6 +2237,7 @@ fn transWhileLoop( | ... | @@ -2237,6 +2237,7 @@ fn transWhileLoop( |
| 2237 | .id = .Loop, | 2237 | .id = .Loop, |
| 2238 | }; | 2238 | }; |
| 2239 | while_node.body = try transStmt(rp, &loop_scope, ZigClangWhileStmt_getBody(stmt), .unused, .r_value); | 2239 | while_node.body = try transStmt(rp, &loop_scope, ZigClangWhileStmt_getBody(stmt), .unused, .r_value); |
| | 2240 | _ = try appendToken(rp.c, .Semicolon, ";"); |
| 2240 | return &while_node.base; | 2241 | return &while_node.base; |
| 2241 | } | 2242 | } |
| 2242 | | 2243 | |
| ... | @@ -2346,8 +2347,10 @@ fn transForLoop( | ... | @@ -2346,8 +2347,10 @@ fn transForLoop( |
| 2346 | try block_scope.?.block_node.statements.push(&while_node.base); | 2347 | try block_scope.?.block_node.statements.push(&while_node.base); |
| 2347 | block_scope.?.block_node.rbrace = try appendToken(rp.c, .RBrace, "}"); | 2348 | block_scope.?.block_node.rbrace = try appendToken(rp.c, .RBrace, "}"); |
| 2348 | return &block_scope.?.block_node.base; | 2349 | return &block_scope.?.block_node.base; |
| 2349 | } else | 2350 | } else { |
| | 2351 | _ = try appendToken(rp.c, .Semicolon, ";"); |
| 2350 | return &while_node.base; | 2352 | return &while_node.base; |
| | 2353 | } |
| 2351 | } | 2354 | } |
| 2352 | | 2355 | |
| 2353 | fn transSwitch( | 2356 | fn transSwitch( |
| ... | @@ -5431,6 +5434,8 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, | ... | @@ -5431,6 +5434,8 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5431 | //else | 5434 | //else |
| 5432 | // @as(dest, x) | 5435 | // @as(dest, x) |
| 5433 | | 5436 | |
| | 5437 | const lparen = try appendToken(c, .LParen, "("); |
| | 5438 | |
| 5434 | const if_1 = try transCreateNodeIf(c); | 5439 | const if_1 = try transCreateNodeIf(c); |
| 5435 | const type_id_1 = try transCreateNodeBuiltinFnCall(c, "@typeInfo"); | 5440 | const type_id_1 = try transCreateNodeBuiltinFnCall(c, "@typeInfo"); |
| 5436 | const type_of_1 = try transCreateNodeBuiltinFnCall(c, "@TypeOf"); | 5441 | const type_of_1 = try transCreateNodeBuiltinFnCall(c, "@TypeOf"); |
| ... | @@ -5492,7 +5497,13 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, | ... | @@ -5492,7 +5497,13 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5492 | as.rparen_token = try appendToken(c, .RParen, ")"); | 5497 | as.rparen_token = try appendToken(c, .RParen, ")"); |
| 5493 | else_2.body = &as.base; | 5498 | else_2.body = &as.base; |
| 5494 | | 5499 | |
| 5495 | return &if_1.base; | 5500 | const group_node = try c.a().create(ast.Node.GroupedExpression); |
| | 5501 | group_node.* = .{ |
| | 5502 | .lparen = lparen, |
| | 5503 | .expr = &if_1.base, |
| | 5504 | .rparen = try appendToken(c, .RParen, ")"), |
| | 5505 | }; |
| | 5506 | return &group_node.base; |
| 5496 | }, | 5507 | }, |
| 5497 | else => { | 5508 | else => { |
| 5498 | const first_tok = it.list.at(0); | 5509 | const first_tok = it.list.at(0); |
| ... | @@ -5545,14 +5556,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, | ... | @@ -5545,14 +5556,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5545 | ); | 5556 | ); |
| 5546 | return error.ParseError; | 5557 | return error.ParseError; |
| 5547 | } | 5558 | } |
| 5548 | // deref is often used together with casts so we group the lhs expression | 5559 | const deref = try transCreateNodePtrDeref(c, node); |
| 5549 | const group = try c.a().create(ast.Node.GroupedExpression); | | |
| 5550 | group.* = .{ | | |
| 5551 | .lparen = try appendToken(c, .LParen, "("), | | |
| 5552 | .expr = node, | | |
| 5553 | .rparen = try appendToken(c, .RParen, ")"), | | |
| 5554 | }; | | |
| 5555 | const deref = try transCreateNodePtrDeref(c, &group.base); | | |
| 5556 | node = try transCreateNodeFieldAccess(c, deref, source[name_tok.start..name_tok.end]); | 5560 | node = try transCreateNodeFieldAccess(c, deref, source[name_tok.start..name_tok.end]); |
| 5557 | continue; | 5561 | continue; |
| 5558 | }, | 5562 | }, |
| ... | @@ -5596,7 +5600,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, | ... | @@ -5596,7 +5600,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5596 | }, | 5600 | }, |
| 5597 | .Ampersand => { | 5601 | .Ampersand => { |
| 5598 | op_token = try appendToken(c, .Ampersand, "&"); | 5602 | op_token = try appendToken(c, .Ampersand, "&"); |
| 5599 | op_id .BitAnd; | 5603 | op_id= .BitAnd; |
| 5600 | }, | 5604 | }, |
| 5601 | .Plus => { | 5605 | .Plus => { |
| 5602 | op_token = try appendToken(c, .Plus, "+"); | 5606 | op_token = try appendToken(c, .Plus, "+"); |
| ... | @@ -5604,7 +5608,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, | ... | @@ -5604,7 +5608,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5604 | }, | 5608 | }, |
| 5605 | .Minus => { | 5609 | .Minus => { |
| 5606 | op_token = try appendToken(c, .Minus, "-"); | 5610 | op_token = try appendToken(c, .Minus, "-"); |
| 5607 | op_id .Sub; | 5611 | op_id= .Sub; |
| 5608 | }, | 5612 | }, |
| 5609 | .AmpersandAmpersand => { | 5613 | .AmpersandAmpersand => { |
| 5610 | op_token = try appendToken(c, .Keyword_and, "and"); | 5614 | op_token = try appendToken(c, .Keyword_and, "and"); |
| ... | @@ -5676,19 +5680,17 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, | ... | @@ -5676,19 +5680,17 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5676 | }, | 5680 | }, |
| 5677 | .BangEqual => { | 5681 | .BangEqual => { |
| 5678 | op_token = try appendToken(c, .BangEqual, "!="); | 5682 | op_token = try appendToken(c, .BangEqual, "!="); |
| 5679 | op_id = .BangEqual; | 5683 | op_id = .BangEqual; |
| 5680 | }, | 5684 | }, |
| 5681 | .EqualEqual => { | 5685 | .EqualEqual => { |
| 5682 | op_token = try appendToken(c, .EqualEqual, "=="); | 5686 | op_token = try appendToken(c, .EqualEqual, "=="); |
| 5683 | op_id = .EqualEqual; | 5687 | op_id = .EqualEqual; |
| 5684 | }, | 5688 | }, |
| 5685 | .Slash => { | 5689 | .Slash => { |
| 5686 | // unsigned/float division uses the operator | | |
| 5687 | op_id = .Div; | 5690 | op_id = .Div; |
| 5688 | op_token = try appendToken(c, .Slash, "/"); | 5691 | op_token = try appendToken(c, .Slash, "/"); |
| 5689 | }, | 5692 | }, |
| 5690 | .Percent => { | 5693 | .Percent => { |
| 5691 | // unsigned/float division uses the operator | | |
| 5692 | op_id = .Mod; | 5694 | op_id = .Mod; |
| 5693 | op_token = try appendToken(c, .Percent, "%"); | 5695 | op_token = try appendToken(c, .Percent, "%"); |
| 5694 | }, | 5696 | }, |
| ... | @@ -5729,25 +5731,12 @@ fn parseCPrefixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, | ... | @@ -5729,25 +5731,12 @@ fn parseCPrefixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5729 | return &node.base; | 5731 | return &node.base; |
| 5730 | }, | 5732 | }, |
| 5731 | .Asterisk => { | 5733 | .Asterisk => { |
| 5732 | // deref is often used together with casts so we group the lhs expression | 5734 | const node = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5733 | const group = try c.a().create(ast.Node.GroupedExpression); | 5735 | return try transCreateNodePtrDeref(c, node); |
| 5734 | group.* = .{ | | |
| 5735 | .lparen = try appendToken(c, .LParen, "("), | | |
| 5736 | .expr = try parseCPrefixOpExpr(c, it, source, source_loc, scope), | | |
| 5737 | .rparen = try appendToken(c, .RParen, ")"), | | |
| 5738 | }; | | |
| 5739 | return try transCreateNodePtrDeref(c, &group.base); | | |
| 5740 | }, | 5736 | }, |
| 5741 | .Ampersand => { | 5737 | .Ampersand => { |
| 5742 | // address of is often used together with casts so we group the rhs expression | | |
| 5743 | const node = try transCreateNodePrefixOp(c, .AddressOf, .Ampersand, "&"); | 5738 | const node = try transCreateNodePrefixOp(c, .AddressOf, .Ampersand, "&"); |
| 5744 | const group = try c.a().create(ast.Node.GroupedExpression); | 5739 | node.rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5745 | group.* = .{ | | |
| 5746 | .lparen = try appendToken(c, .LParen, "("), | | |
| 5747 | .expr = try parseCPrefixOpExpr(c, it, source, source_loc, scope), | | |
| 5748 | .rparen = try appendToken(c, .RParen, ")"), | | |
| 5749 | }; | | |
| 5750 | node.rhs = &group.base; | | |
| 5751 | return &node.base; | 5740 | return &node.base; |
| 5752 | }, | 5741 | }, |
| 5753 | else => { | 5742 | else => { |