Skip to content

Commit 935758f

Browse files
committed
Remove parens inside initializer expression list
Current solution compiles `v : std::vector<int> = ( 1, 2, 3 );` into `std::vector<int> v { (1, 2, 3) };` This commit change that behaviour and removes extra parens from generated code.
1 parent 874b2c5 commit 935758f

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

source/cppfront.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1990,7 +1990,7 @@ class cppfront
19901990
//
19911991
auto emit(expression_list_node const& n) -> void
19921992
{
1993-
if (should_add_expression_list_parens() && !n.expressions.empty()) {
1993+
if (should_add_expression_list_parens() && !n.expressions.empty() && !n.inside_initializer) {
19941994
printer.print_cpp2("(", n.position());
19951995
}
19961996

@@ -2024,7 +2024,7 @@ class cppfront
20242024
}
20252025
}
20262026

2027-
if (should_add_expression_list_parens() && !n.expressions.empty()) {
2027+
if (should_add_expression_list_parens() && !n.expressions.empty() && !n.inside_initializer) {
20282028
printer.print_cpp2(")", n.position());
20292029
}
20302030
// 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)