aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kamm <kamm@incasoftware.de>2012-09-19 11:26:33 +0200
committerhjk <qthjk@ovi.com>2012-09-19 12:23:18 +0200
commitaa645254a240845aa69d24896b2e88120884d938 (patch)
treed7a95c5b38d641fa1c073994bc436a6808a80a3d
parent83da5f68bec13dcb05b84a005f4bb3bc7e8bc82b (diff)
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 <qthjk@ovi.com>
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp26
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h29
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp10
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatch0.cpp8
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp17
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.h1
-rw-r--r--src/libs/3rdparty/cplusplus/ASTPatternBuilder.h9
-rw-r--r--src/libs/3rdparty/cplusplus/ASTVisit.cpp8
-rw-r--r--src/libs/3rdparty/cplusplus/ASTVisitor.h2
-rw-r--r--src/libs/3rdparty/cplusplus/ASTfwd.h1
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.cpp19
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.h2
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp15
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.h2
-rw-r--r--src/libs/cplusplus/FindUsages.cpp19
-rw-r--r--src/libs/cplusplus/FindUsages.h2
-rw-r--r--src/plugins/cpptools/cppchecksymbols.cpp13
-rw-r--r--tests/auto/cplusplus/cxx11/data/braceInitializers.3.cpp3
-rw-r--r--tests/tools/cplusplus-dump/dumpers.inc10
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
@@ -2053,32 +2053,6 @@ unsigned NewExpressionAST::lastToken() const
}
/** \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
{
if (lparen_token)
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<T>{};
+
+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)