Skip to content

Commit c511638

Browse files
authored
Merge pull request #67 from filipsajdak/fsajdak-fix-preserve-parens
[FIX] preserve parens around expressions calculating value of argument for a function call
2 parents 0bba5e7 + 935758f commit c511638

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

source/cppfront.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1980,15 +1980,17 @@ class cppfront
19801980
auto emit(expression_node const& n) -> void
19811981
{
19821982
assert(n.expr);
1983+
push_need_expression_list_parens(true);
19831984
emit(*n.expr);
1985+
pop_need_expression_list_parens();
19841986
}
19851987

19861988

19871989
//-----------------------------------------------------------------------
19881990
//
19891991
auto emit(expression_list_node const& n) -> void
19901992
{
1991-
if (should_add_expression_list_parens() && !n.expressions.empty()) {
1993+
if (should_add_expression_list_parens() && !n.expressions.empty() && !n.inside_initializer) {
19921994
printer.print_cpp2("(", n.position());
19931995
}
19941996

@@ -2022,7 +2024,7 @@ class cppfront
20222024
}
20232025
}
20242026

2025-
if (should_add_expression_list_parens() && !n.expressions.empty()) {
2027+
if (should_add_expression_list_parens() && !n.expressions.empty() && !n.inside_initializer) {
20262028
printer.print_cpp2(")", n.position());
20272029
}
20282030
// We want to consume only one of these

source/parse.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ struct expression_list_node
257257
{
258258
source_position open_paren = {};
259259
source_position close_paren = {};
260+
bool inside_initializer = false;
260261

261262
struct term {
262263
passing_style pass = {};
@@ -1317,9 +1318,10 @@ class parser
13171318

13181319
if (curr().type() == lexeme::LeftParen)
13191320
{
1321+
bool inside_initializer = (peek(-1)->type() == lexeme::Assignment);
13201322
auto open_paren = curr().position();
13211323
next();
1322-
auto expr_list = expression_list(open_paren);
1324+
auto expr_list = expression_list(open_paren, inside_initializer);
13231325
if (!expr_list) {
13241326
error("unexpected text - ( is not followed by an expression-list");
13251327
next();
@@ -1704,10 +1706,11 @@ class parser
17041706
//G expression
17051707
//G expression-list , expression
17061708
//G
1707-
auto expression_list(source_position open_paren) -> std::unique_ptr<expression_list_node> {
1709+
auto expression_list(source_position open_paren, bool inside_initializer = false) -> std::unique_ptr<expression_list_node> {
17081710
auto pass = passing_style::in;
17091711
auto n = std::make_unique<expression_list_node>();
17101712
n->open_paren = open_paren;
1713+
n->inside_initializer = inside_initializer;
17111714

17121715
if (curr().type() == lexeme::Identifier && curr() == "out") {
17131716
pass = passing_style::out;

0 commit comments

Comments
 (0)