summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-03-23 13:43:18 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-03-23 14:13:21 +0100
commit8b625a867c24a9dd62a3c6c866622284eafd24c7 (patch)
tree2f5111e000363df9cd2c60ae3c185b9a0fdc54ac
parent199d1e14c5bf0e7910baec625ca0f77606c5bb43 (diff)
downloadqt-creator-8b625a867c24a9dd62a3c6c866622284eafd24c7.tar.gz
Parse C++0x mem-initializer-list.
-rw-r--r--src/shared/cplusplus/AST.cpp4
-rw-r--r--src/shared/cplusplus/AST.h2
-rw-r--r--src/shared/cplusplus/Parser.cpp14
3 files changed, 18 insertions, 2 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 15a5901efc..9238e8d41b 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -694,7 +694,9 @@ unsigned CtorInitializerAST::firstToken() const
unsigned CtorInitializerAST::lastToken() const
{
- if (member_initializer_list)
+ if (dot_dot_dot_token)
+ return dot_dot_dot_token + 1;
+ else if (member_initializer_list)
return member_initializer_list->lastToken();
return colon_token + 1;
}
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index b3c5858ffb..c022d6287b 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1314,11 +1314,13 @@ class CPLUSPLUS_EXPORT CtorInitializerAST: public AST
public:
unsigned colon_token;
MemInitializerListAST *member_initializer_list;
+ unsigned dot_dot_dot_token;
public:
CtorInitializerAST()
: colon_token(0)
, member_initializer_list(0)
+ , dot_dot_dot_token(0)
{}
virtual CtorInitializerAST *asCtorInitializer() { return this; }
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 32b18dbec9..5e86a4cc02 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2087,6 +2087,10 @@ bool Parser::parseCtorInitializer(CtorInitializerAST *&node)
ast->colon_token = colon_token;
parseMemInitializerList(ast->member_initializer_list);
+
+ if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT)
+ ast->dot_dot_dot_token = consumeToken();
+
node = ast;
return true;
}
@@ -2243,6 +2247,9 @@ bool Parser::parseMemInitializerList(MemInitializerListAST *&node)
if (LA() == T_LBRACE)
break;
+ else if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT && LA(2) == T_LBRACE)
+ break;
+
else if (LA() == T_COMMA || (LA() == T_IDENTIFIER && (LA(2) == T_LPAREN || LA(2) == T_COLON_COLON))) {
if (LA() != T_COMMA)
_translationUnit->error(cursor(), "expected `,'");
@@ -2257,8 +2264,13 @@ bool Parser::parseMemInitializerList(MemInitializerListAST *&node)
} else break;
}
- if (LA() != T_LBRACE)
+ if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT) {
+ if (LA(2) != T_LBRACE)
+ _translationUnit->error(cursor(), "expected `{'");
+
+ } else if (LA() != T_LBRACE) {
_translationUnit->error(cursor(), "expected `{'");
+ }
return true;
}