From aa645254a240845aa69d24896b2e88120884d938 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 19 Sep 2012 11:26:33 +0200 Subject: C++11: More (expression-list) or brace-init-list. This time in the 'new' expression. Changed it to make new C(1, abc...) and new C{1, abc} work. Change-Id: I7232798fd083b653ee04ef9ede386d6536133e16 Reviewed-by: hjk --- src/libs/3rdparty/cplusplus/AST.cpp | 26 ------------------- src/libs/3rdparty/cplusplus/AST.h | 29 +--------------------- src/libs/3rdparty/cplusplus/ASTClone.cpp | 10 -------- src/libs/3rdparty/cplusplus/ASTMatch0.cpp | 8 ------ src/libs/3rdparty/cplusplus/ASTMatcher.cpp | 17 ------------- src/libs/3rdparty/cplusplus/ASTMatcher.h | 1 - src/libs/3rdparty/cplusplus/ASTPatternBuilder.h | 9 +------ src/libs/3rdparty/cplusplus/ASTVisit.cpp | 8 ------ src/libs/3rdparty/cplusplus/ASTVisitor.h | 2 -- src/libs/3rdparty/cplusplus/ASTfwd.h | 1 - src/libs/3rdparty/cplusplus/Bind.cpp | 19 +------------- src/libs/3rdparty/cplusplus/Bind.h | 2 -- src/libs/3rdparty/cplusplus/Parser.cpp | 15 +++-------- src/libs/3rdparty/cplusplus/Parser.h | 2 +- src/libs/cplusplus/FindUsages.cpp | 19 +------------- src/libs/cplusplus/FindUsages.h | 2 -- src/plugins/cpptools/cppchecksymbols.cpp | 13 +++++----- .../cplusplus/cxx11/data/braceInitializers.3.cpp | 3 +++ tests/tools/cplusplus-dump/dumpers.inc | 10 -------- 19 files changed, 19 insertions(+), 177 deletions(-) diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp index 1510d4dcfc..fd8b4fcfed 100644 --- a/src/libs/3rdparty/cplusplus/AST.cpp +++ b/src/libs/3rdparty/cplusplus/AST.cpp @@ -2052,32 +2052,6 @@ unsigned NewExpressionAST::lastToken() const return 1; } -/** \generated */ -unsigned NewInitializerAST::firstToken() const -{ - if (lparen_token) - return lparen_token; - if (expression) - if (unsigned candidate = expression->firstToken()) - return candidate; - if (rparen_token) - return rparen_token; - return 0; -} - -/** \generated */ -unsigned NewInitializerAST::lastToken() const -{ - if (rparen_token) - return rparen_token + 1; - if (expression) - if (unsigned candidate = expression->lastToken()) - return candidate; - if (lparen_token) - return lparen_token + 1; - return 1; -} - /** \generated */ unsigned ExpressionListParenAST::firstToken() const { diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index 9ebe42bd17..d6c62a3c7d 100644 --- a/src/libs/3rdparty/cplusplus/AST.h +++ b/src/libs/3rdparty/cplusplus/AST.h @@ -198,7 +198,6 @@ public: virtual NestedNameSpecifierAST *asNestedNameSpecifier() { return 0; } virtual NewArrayDeclaratorAST *asNewArrayDeclarator() { return 0; } virtual NewExpressionAST *asNewExpression() { return 0; } - virtual NewInitializerAST *asNewInitializer() { return 0; } virtual NewTypeIdAST *asNewTypeId() { return 0; } virtual NoExceptSpecificationAST *asNoExceptSpecification() { return 0; } virtual NumericLiteralAST *asNumericLiteral() { return 0; } @@ -2502,7 +2501,7 @@ public: NewTypeIdAST *new_type_id; - NewInitializerAST *new_initializer; + ExpressionAST *new_initializer; // either ExpressionListParenAST or BracedInitializerAST public: NewExpressionAST() @@ -2528,32 +2527,6 @@ protected: virtual bool match0(AST *, ASTMatcher *); }; -class CPLUSPLUS_EXPORT NewInitializerAST: public AST -{ -public: - unsigned lparen_token; - ExpressionAST *expression; - unsigned rparen_token; - -public: - NewInitializerAST() - : lparen_token(0) - , expression(0) - , rparen_token(0) - {} - - virtual NewInitializerAST *asNewInitializer() { return this; } - - virtual unsigned firstToken() const; - virtual unsigned lastToken() const; - - virtual NewInitializerAST *clone(MemoryPool *pool) const; - -protected: - virtual void accept0(ASTVisitor *visitor); - virtual bool match0(AST *, ASTMatcher *); -}; - class CPLUSPLUS_EXPORT NewTypeIdAST: public AST { public: diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp index 5223ce8c73..7c151f09f6 100644 --- a/src/libs/3rdparty/cplusplus/ASTClone.cpp +++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp @@ -930,16 +930,6 @@ NewExpressionAST *NewExpressionAST::clone(MemoryPool *pool) const return ast; } -NewInitializerAST *NewInitializerAST::clone(MemoryPool *pool) const -{ - NewInitializerAST *ast = new (pool) NewInitializerAST; - ast->lparen_token = lparen_token; - if (expression) - ast->expression = expression->clone(pool); - ast->rparen_token = rparen_token; - return ast; -} - NewTypeIdAST *NewTypeIdAST::clone(MemoryPool *pool) const { NewTypeIdAST *ast = new (pool) NewTypeIdAST; diff --git a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp index a1bdb656e8..de743a2f7f 100644 --- a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp +++ b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp @@ -624,14 +624,6 @@ bool NewExpressionAST::match0(AST *pattern, ASTMatcher *matcher) return false; } -bool NewInitializerAST::match0(AST *pattern, ASTMatcher *matcher) -{ - if (NewInitializerAST *_other = pattern->asNewInitializer()) - return matcher->match(this, _other); - - return false; -} - bool NewTypeIdAST::match0(AST *pattern, ASTMatcher *matcher) { if (NewTypeIdAST *_other = pattern->asNewTypeId()) diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp index 31401c8f4f..e2df7d7583 100644 --- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp +++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp @@ -1585,23 +1585,6 @@ bool ASTMatcher::match(NewExpressionAST *node, NewExpressionAST *pattern) return true; } -bool ASTMatcher::match(NewInitializerAST *node, NewInitializerAST *pattern) -{ - (void) node; - (void) pattern; - - pattern->lparen_token = node->lparen_token; - - if (! pattern->expression) - pattern->expression = node->expression; - else if (! AST::match(node->expression, pattern->expression, this)) - return false; - - pattern->rparen_token = node->rparen_token; - - return true; -} - bool ASTMatcher::match(NewTypeIdAST *node, NewTypeIdAST *pattern) { (void) node; diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.h b/src/libs/3rdparty/cplusplus/ASTMatcher.h index dd265d3db8..29842253cd 100644 --- a/src/libs/3rdparty/cplusplus/ASTMatcher.h +++ b/src/libs/3rdparty/cplusplus/ASTMatcher.h @@ -100,7 +100,6 @@ public: virtual bool match(NestedNameSpecifierAST *node, NestedNameSpecifierAST *pattern); virtual bool match(NewArrayDeclaratorAST *node, NewArrayDeclaratorAST *pattern); virtual bool match(NewExpressionAST *node, NewExpressionAST *pattern); - virtual bool match(NewInitializerAST *node, NewInitializerAST *pattern); virtual bool match(NewTypeIdAST *node, NewTypeIdAST *pattern); virtual bool match(NoExceptSpecificationAST *node, NoExceptSpecificationAST *pattern); virtual bool match(NumericLiteralAST *node, NumericLiteralAST *pattern); diff --git a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h index 4406849444..142737d44e 100644 --- a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h +++ b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h @@ -599,7 +599,7 @@ public: return __ast; } - NewExpressionAST *NewExpression(ExpressionListParenAST *new_placement = 0, ExpressionAST *type_id = 0, NewTypeIdAST *new_type_id = 0, NewInitializerAST *new_initializer = 0) + NewExpressionAST *NewExpression(ExpressionListParenAST *new_placement = 0, ExpressionAST *type_id = 0, NewTypeIdAST *new_type_id = 0, ExpressionAST *new_initializer = 0) { NewExpressionAST *__ast = new (&pool) NewExpressionAST; __ast->new_placement = new_placement; @@ -609,13 +609,6 @@ public: return __ast; } - NewInitializerAST *NewInitializer(ExpressionAST *expression = 0) - { - NewInitializerAST *__ast = new (&pool) NewInitializerAST; - __ast->expression = expression; - return __ast; - } - NewTypeIdAST *NewTypeId(SpecifierListAST *type_specifier_list = 0, PtrOperatorListAST *ptr_operator_list = 0, NewArrayDeclaratorListAST *new_array_declarator_list = 0) { NewTypeIdAST *__ast = new (&pool) NewTypeIdAST; diff --git a/src/libs/3rdparty/cplusplus/ASTVisit.cpp b/src/libs/3rdparty/cplusplus/ASTVisit.cpp index b06b9ea3b6..6434a7c5e2 100644 --- a/src/libs/3rdparty/cplusplus/ASTVisit.cpp +++ b/src/libs/3rdparty/cplusplus/ASTVisit.cpp @@ -671,14 +671,6 @@ void NewExpressionAST::accept0(ASTVisitor *visitor) visitor->endVisit(this); } -void NewInitializerAST::accept0(ASTVisitor *visitor) -{ - if (visitor->visit(this)) { - accept(expression, visitor); - } - visitor->endVisit(this); -} - void NewTypeIdAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { diff --git a/src/libs/3rdparty/cplusplus/ASTVisitor.h b/src/libs/3rdparty/cplusplus/ASTVisitor.h index 6b097d9f52..a7d3f728f6 100644 --- a/src/libs/3rdparty/cplusplus/ASTVisitor.h +++ b/src/libs/3rdparty/cplusplus/ASTVisitor.h @@ -142,7 +142,6 @@ public: virtual bool visit(NestedNameSpecifierAST *) { return true; } virtual bool visit(NewArrayDeclaratorAST *) { return true; } virtual bool visit(NewExpressionAST *) { return true; } - virtual bool visit(NewInitializerAST *) { return true; } virtual bool visit(NewTypeIdAST *) { return true; } virtual bool visit(NoExceptSpecificationAST *) { return true; } virtual bool visit(NumericLiteralAST *) { return true; } @@ -288,7 +287,6 @@ public: virtual void endVisit(NestedNameSpecifierAST *) {} virtual void endVisit(NewArrayDeclaratorAST *) {} virtual void endVisit(NewExpressionAST *) {} - virtual void endVisit(NewInitializerAST *) {} virtual void endVisit(NewTypeIdAST *) {} virtual void endVisit(NoExceptSpecificationAST *) {} virtual void endVisit(NumericLiteralAST *) {} diff --git a/src/libs/3rdparty/cplusplus/ASTfwd.h b/src/libs/3rdparty/cplusplus/ASTfwd.h index 7146134782..722a5b0d38 100644 --- a/src/libs/3rdparty/cplusplus/ASTfwd.h +++ b/src/libs/3rdparty/cplusplus/ASTfwd.h @@ -105,7 +105,6 @@ class NestedExpressionAST; class NestedNameSpecifierAST; class NewArrayDeclaratorAST; class NewExpressionAST; -class NewInitializerAST; class NewTypeIdAST; class NoExceptSpecificationAST; class NumericLiteralAST; diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index 7a6a1cbf43..0aa0f43712 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -580,23 +580,6 @@ FullySpecifiedType Bind::newArrayDeclarator(NewArrayDeclaratorAST *ast, const Fu return type; } -bool Bind::visit(NewInitializerAST *ast) -{ - (void) ast; - assert(!"unreachable"); - return false; -} - -void Bind::newInitializer(NewInitializerAST *ast) -{ - if (! ast) - return; - - // unsigned lparen_token = ast->lparen_token; - ExpressionTy expression = this->expression(ast->expression); - // unsigned rparen_token = ast->rparen_token; -} - bool Bind::visit(NewTypeIdAST *ast) { (void) ast; @@ -1637,7 +1620,7 @@ bool Bind::visit(NewExpressionAST *ast) ExpressionTy type_id = this->expression(ast->type_id); // unsigned rparen_token = ast->rparen_token; this->newTypeId(ast->new_type_id); - this->newInitializer(ast->new_initializer); + this->expression(ast->new_initializer); return false; } diff --git a/src/libs/3rdparty/cplusplus/Bind.h b/src/libs/3rdparty/cplusplus/Bind.h index ff1ec0f4be..93022b9af7 100644 --- a/src/libs/3rdparty/cplusplus/Bind.h +++ b/src/libs/3rdparty/cplusplus/Bind.h @@ -87,7 +87,6 @@ protected: const Name *nestedNameSpecifier(NestedNameSpecifierAST *ast); void newPlacement(ExpressionListParenAST *ast); FullySpecifiedType newArrayDeclarator(NewArrayDeclaratorAST *ast, const FullySpecifiedType &init); - void newInitializer(NewInitializerAST *ast); FullySpecifiedType newTypeId(NewTypeIdAST *ast); OperatorNameId::Kind cppOperator(OperatorAST *ast); void parameterDeclarationClause(ParameterDeclarationClauseAST *ast, unsigned lparen_token, Function *fun); @@ -123,7 +122,6 @@ protected: virtual bool visit(MemInitializerAST *ast); virtual bool visit(NestedNameSpecifierAST *ast); virtual bool visit(NewArrayDeclaratorAST *ast); - virtual bool visit(NewInitializerAST *ast); virtual bool visit(NewTypeIdAST *ast); virtual bool visit(OperatorAST *ast); virtual bool visit(ParameterDeclarationClauseAST *ast); diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 58b4f90535..8c2b26af07 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -5091,20 +5091,13 @@ bool Parser::parseNewArrayDeclarator(NewArrayDeclaratorListAST *&node) return true; } -bool Parser::parseNewInitializer(NewInitializerAST *&node) +bool Parser::parseNewInitializer(ExpressionAST *&node) { DEBUG_THIS_RULE(); if (LA() == T_LPAREN) { - unsigned lparen_token = consumeToken(); - ExpressionAST *expression = 0; - if (LA() == T_RPAREN || parseExpression(expression)) { - NewInitializerAST *ast = new (_pool) NewInitializerAST; - ast->lparen_token = lparen_token; - ast->expression = expression; - match(T_RPAREN, &ast->rparen_token); - node = ast; - return true; - } + return parseExpressionListParen(node); + } else if (_cxx0xEnabled && LA() == T_LBRACE) { + return parseBracedInitList0x(node); } return false; } diff --git a/src/libs/3rdparty/cplusplus/Parser.h b/src/libs/3rdparty/cplusplus/Parser.h index a11de40b63..f5971e4040 100644 --- a/src/libs/3rdparty/cplusplus/Parser.h +++ b/src/libs/3rdparty/cplusplus/Parser.h @@ -133,7 +133,7 @@ public: bool parseNewArrayDeclarator(NewArrayDeclaratorListAST *&node); bool parseNewExpression(ExpressionAST *&node); bool parseExpressionListParen(ExpressionAST *&node); - bool parseNewInitializer(NewInitializerAST *&node); + bool parseNewInitializer(ExpressionAST *&node); bool parseNewTypeId(NewTypeIdAST *&node); bool parseOperator(OperatorAST *&node); bool parseConversionFunctionId(NameAST *&node); diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp index f84056ff94..237482647b 100644 --- a/src/libs/cplusplus/FindUsages.cpp +++ b/src/libs/cplusplus/FindUsages.cpp @@ -594,23 +594,6 @@ void FindUsages::newArrayDeclarator(NewArrayDeclaratorAST *ast) // unsigned rbracket_token = ast->rbracket_token; } -bool FindUsages::visit(NewInitializerAST *ast) -{ - (void) ast; - Q_ASSERT(!"unreachable"); - return false; -} - -void FindUsages::newInitializer(NewInitializerAST *ast) -{ - if (! ast) - return; - - // unsigned lparen_token = ast->lparen_token; - this->expression(ast->expression); - // unsigned rparen_token = ast->rparen_token; -} - bool FindUsages::visit(NewTypeIdAST *ast) { (void) ast; @@ -1295,7 +1278,7 @@ bool FindUsages::visit(NewExpressionAST *ast) this->expression(ast->type_id); // unsigned rparen_token = ast->rparen_token; this->newTypeId(ast->new_type_id); - this->newInitializer(ast->new_initializer); + this->expression(ast->new_initializer); return false; } diff --git a/src/libs/cplusplus/FindUsages.h b/src/libs/cplusplus/FindUsages.h index d5e15555d9..24bebc8a55 100644 --- a/src/libs/cplusplus/FindUsages.h +++ b/src/libs/cplusplus/FindUsages.h @@ -106,7 +106,6 @@ protected: void nestedNameSpecifier(NestedNameSpecifierAST *ast); void newPlacement(ExpressionListParenAST *ast); void newArrayDeclarator(NewArrayDeclaratorAST *ast); - void newInitializer(NewInitializerAST *ast); void newTypeId(NewTypeIdAST *ast); void cppOperator(OperatorAST *ast); void parameterDeclarationClause(ParameterDeclarationClauseAST *ast); @@ -138,7 +137,6 @@ protected: virtual bool visit(MemInitializerAST *ast); virtual bool visit(NestedNameSpecifierAST *ast); virtual bool visit(NewArrayDeclaratorAST *ast); - virtual bool visit(NewInitializerAST *ast); virtual bool visit(NewTypeIdAST *ast); virtual bool visit(OperatorAST *ast); virtual bool visit(ParameterDeclarationClauseAST *ast); diff --git a/src/plugins/cpptools/cppchecksymbols.cpp b/src/plugins/cpptools/cppchecksymbols.cpp index 709c175c2a..cd77278e6b 100644 --- a/src/plugins/cpptools/cppchecksymbols.cpp +++ b/src/plugins/cpptools/cppchecksymbols.cpp @@ -663,13 +663,14 @@ bool CheckSymbols::visit(NewExpressionAST *ast) if (binding && nameAST) { int arguments = 0; if (ast->new_initializer) { - if (ExpressionAST *expr = ast->new_initializer->expression) { - while (BinaryExpressionAST *binExpr = expr->asBinaryExpression()) { - expr = binExpr->right_expression; - ++arguments; - } + ExpressionListAST *list = 0; + if (ExpressionListParenAST *exprListParen = ast->new_initializer->asExpressionListParen()) { + list = exprListParen->expression_list; + } else if (BracedInitializerAST *braceInit = ast->new_initializer->asBracedInitializer()) { + list = braceInit->expression_list; } - + for (ExpressionListAST *it = list; it; it = it->next) + ++arguments; } Scope *scope = enclosingScope(); diff --git a/tests/auto/cplusplus/cxx11/data/braceInitializers.3.cpp b/tests/auto/cplusplus/cxx11/data/braceInitializers.3.cpp index 58b5a8dd48..5105b4690c 100644 --- a/tests/auto/cplusplus/cxx11/data/braceInitializers.3.cpp +++ b/tests/auto/cplusplus/cxx11/data/braceInitializers.3.cpp @@ -1,3 +1,6 @@ auto x = int{}; auto y = Foo{}; auto z = typename Foo{}; + +auto d = new C(1, abc...); +auto e = new C{1, 2, 3}; diff --git a/tests/tools/cplusplus-dump/dumpers.inc b/tests/tools/cplusplus-dump/dumpers.inc index 6e4ec32e74..4ce49361e6 100644 --- a/tests/tools/cplusplus-dump/dumpers.inc +++ b/tests/tools/cplusplus-dump/dumpers.inc @@ -906,16 +906,6 @@ virtual bool visit(NewExpressionAST *ast) return false; } -virtual bool visit(NewInitializerAST *ast) -{ - if (ast->lparen_token) - terminal(ast->lparen_token, ast); - nonterminal(ast->expression); - if (ast->rparen_token) - terminal(ast->rparen_token, ast); - return false; -} - virtual bool visit(NewTypeIdAST *ast) { for (SpecifierListAST *iter = ast->type_specifier_list; iter; iter = iter->next) -- cgit v1.2.3