aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp34
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h31
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp12
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatch0.cpp8
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp21
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.h1
-rw-r--r--src/libs/3rdparty/cplusplus/ASTPatternBuilder.h7
-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/Parser.cpp46
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.h2
-rw-r--r--tests/auto/cplusplus/cxx11/data/aliasDecl.1.cpp4
-rw-r--r--tests/auto/cplusplus/cxx11/tst_cxx11.cpp1
-rw-r--r--tests/tools/cplusplus-dump/dumpers.inc14
15 files changed, 192 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp
index 2057a8372e2..14d7fc48b07 100644
--- a/src/libs/3rdparty/cplusplus/AST.cpp
+++ b/src/libs/3rdparty/cplusplus/AST.cpp
@@ -4431,3 +4431,37 @@ unsigned AlignofExpressionAST::lastToken() const
return 1;
}
+/** \generated */
+unsigned AliasDeclarationAST::firstToken() const
+{
+ if (using_token)
+ return using_token;
+ if (identifier_token)
+ return identifier_token;
+ if (equal_token)
+ return equal_token;
+ if (typeId)
+ if (unsigned candidate = typeId->firstToken())
+ return candidate;
+ if (semicolon_token)
+ return semicolon_token;
+ return 0;
+}
+
+/** \generated */
+unsigned AliasDeclarationAST::lastToken() const
+{
+ if (semicolon_token)
+ return semicolon_token + 1;
+ if (typeId)
+ if (unsigned candidate = typeId->lastToken())
+ return candidate;
+ if (equal_token)
+ return equal_token + 1;
+ if (identifier_token)
+ return identifier_token + 1;
+ if (using_token)
+ return using_token + 1;
+ return 1;
+}
+
diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h
index bcb691910c5..f6718e19144 100644
--- a/src/libs/3rdparty/cplusplus/AST.h
+++ b/src/libs/3rdparty/cplusplus/AST.h
@@ -125,6 +125,7 @@ public:
virtual AST *clone(MemoryPool *pool) const = 0;
virtual AccessDeclarationAST *asAccessDeclaration() { return 0; }
+ virtual AliasDeclarationAST *asAliasDeclaration() { return 0; }
virtual AlignofExpressionAST *asAlignofExpression() { return 0; }
virtual ArrayAccessAST *asArrayAccess() { return 0; }
virtual ArrayDeclaratorAST *asArrayDeclarator() { return 0; }
@@ -2400,6 +2401,36 @@ protected:
virtual bool match0(AST *, ASTMatcher *);
};
+class CPLUSPLUS_EXPORT AliasDeclarationAST: public DeclarationAST
+{
+public:
+ unsigned using_token;
+ unsigned identifier_token;
+ unsigned equal_token;
+ TypeIdAST *typeId;
+ unsigned semicolon_token;
+
+public:
+ AliasDeclarationAST()
+ : using_token(0)
+ , identifier_token(0)
+ , equal_token(0)
+ , typeId(0)
+ , semicolon_token(0)
+ {}
+
+ virtual AliasDeclarationAST *asAliasDeclaration() { return this; }
+
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+ virtual AliasDeclarationAST *clone(MemoryPool *pool) const;
+
+protected:
+ virtual void accept0(ASTVisitor *visitor);
+ virtual bool match0(AST *, ASTMatcher *);
+};
+
class CPLUSPLUS_EXPORT ExpressionListParenAST: public ExpressionAST
{
public:
diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp
index 7605c049302..64b1c1bc81e 100644
--- a/src/libs/3rdparty/cplusplus/ASTClone.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp
@@ -874,6 +874,18 @@ NamespaceAliasDefinitionAST *NamespaceAliasDefinitionAST::clone(MemoryPool *pool
return ast;
}
+AliasDeclarationAST *AliasDeclarationAST::clone(MemoryPool *pool) const
+{
+ AliasDeclarationAST *ast = new (pool) AliasDeclarationAST;
+ ast->using_token = using_token;
+ ast->identifier_token = identifier_token;
+ ast->equal_token = equal_token;
+ if (typeId)
+ ast->typeId = typeId->clone(pool);
+ ast->semicolon_token = semicolon_token;
+ return ast;
+}
+
ExpressionListParenAST *ExpressionListParenAST::clone(MemoryPool *pool) const
{
ExpressionListParenAST *ast = new (pool) ExpressionListParenAST;
diff --git a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp
index e51604fe45a..a1bdb656e84 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp
@@ -592,6 +592,14 @@ bool NamespaceAliasDefinitionAST::match0(AST *pattern, ASTMatcher *matcher)
return false;
}
+bool AliasDeclarationAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+ if (AliasDeclarationAST *_other = pattern->asAliasDeclaration())
+ return matcher->match(this, _other);
+
+ return false;
+}
+
bool ExpressionListParenAST::match0(AST *pattern, ASTMatcher *matcher)
{
if (ExpressionListParenAST *_other = pattern->asExpressionListParen())
diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
index 8832cecc57c..061c75814d2 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
@@ -1485,6 +1485,27 @@ bool ASTMatcher::match(NamespaceAliasDefinitionAST *node, NamespaceAliasDefiniti
return true;
}
+bool ASTMatcher::match(AliasDeclarationAST *node, AliasDeclarationAST *pattern)
+{
+ (void) node;
+ (void) pattern;
+
+ pattern->using_token = node->using_token;
+
+ pattern->identifier_token = node->identifier_token;
+
+ pattern->equal_token = node->equal_token;
+
+ if (! pattern->typeId)
+ pattern->typeId = node->typeId;
+ else if (! AST::match(node->typeId, pattern->typeId, this))
+ return false;
+
+ pattern->semicolon_token = node->semicolon_token;
+
+ return true;
+}
+
bool ASTMatcher::match(ExpressionListParenAST *node, ExpressionListParenAST *pattern)
{
(void) node;
diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.h b/src/libs/3rdparty/cplusplus/ASTMatcher.h
index add9bddd4d6..dd265d3db86 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatcher.h
+++ b/src/libs/3rdparty/cplusplus/ASTMatcher.h
@@ -32,6 +32,7 @@ public:
virtual ~ASTMatcher();
virtual bool match(AccessDeclarationAST *node, AccessDeclarationAST *pattern);
+ virtual bool match(AliasDeclarationAST *node, AliasDeclarationAST *pattern);
virtual bool match(AlignofExpressionAST *node, AlignofExpressionAST *pattern);
virtual bool match(ArrayAccessAST *node, ArrayAccessAST *pattern);
virtual bool match(ArrayDeclaratorAST *node, ArrayDeclaratorAST *pattern);
diff --git a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
index 4f69b6999a7..004f5d80b5c 100644
--- a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
+++ b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
@@ -577,6 +577,13 @@ public:
return __ast;
}
+ AliasDeclarationAST *AliasDeclaration(TypeIdAST *typeId = 0)
+ {
+ AliasDeclarationAST *__ast = new (&pool) AliasDeclarationAST;
+ __ast->typeId = typeId;
+ return __ast;
+ }
+
ExpressionListParenAST *ExpressionListParen(ExpressionListAST *expression_list = 0)
{
ExpressionListParenAST *__ast = new (&pool) ExpressionListParenAST;
diff --git a/src/libs/3rdparty/cplusplus/ASTVisit.cpp b/src/libs/3rdparty/cplusplus/ASTVisit.cpp
index 9a7f926cc89..e59a0385ae4 100644
--- a/src/libs/3rdparty/cplusplus/ASTVisit.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTVisit.cpp
@@ -635,6 +635,14 @@ void NamespaceAliasDefinitionAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this);
}
+void AliasDeclarationAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ accept(typeId, visitor);
+ }
+ visitor->endVisit(this);
+}
+
void ExpressionListParenAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
diff --git a/src/libs/3rdparty/cplusplus/ASTVisitor.h b/src/libs/3rdparty/cplusplus/ASTVisitor.h
index e6734ecf737..6b097d9f524 100644
--- a/src/libs/3rdparty/cplusplus/ASTVisitor.h
+++ b/src/libs/3rdparty/cplusplus/ASTVisitor.h
@@ -74,6 +74,7 @@ public:
virtual void postVisit(AST *) {}
virtual bool visit(AccessDeclarationAST *) { return true; }
+ virtual bool visit(AliasDeclarationAST *) { return true; }
virtual bool visit(AlignofExpressionAST *) { return true; }
virtual bool visit(ArrayAccessAST *) { return true; }
virtual bool visit(ArrayDeclaratorAST *) { return true; }
@@ -219,6 +220,7 @@ public:
virtual bool visit(WhileStatementAST *) { return true; }
virtual void endVisit(AccessDeclarationAST *) {}
+ virtual void endVisit(AliasDeclarationAST *) {}
virtual void endVisit(AlignofExpressionAST *) {}
virtual void endVisit(ArrayAccessAST *) {}
virtual void endVisit(ArrayDeclaratorAST *) {}
diff --git a/src/libs/3rdparty/cplusplus/ASTfwd.h b/src/libs/3rdparty/cplusplus/ASTfwd.h
index 4d07f6507d9..7146134782d 100644
--- a/src/libs/3rdparty/cplusplus/ASTfwd.h
+++ b/src/libs/3rdparty/cplusplus/ASTfwd.h
@@ -32,6 +32,7 @@ class ASTVisitor;
class ASTMatcher;
class AccessDeclarationAST;
+class AliasDeclarationAST;
class AlignofExpressionAST;
class ArrayAccessAST;
class ArrayDeclaratorAST;
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index b4bf8158e22..7769b0cc094 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -367,6 +367,18 @@ bool Parser::skip(int l, int r)
return false;
}
+int Parser::find(int token, int stopAt)
+{
+ for (int i = 1; ; ++i) {
+ const int tk = LA(i);
+ if (!tk || tk == stopAt)
+ return 0;
+ if (tk == token)
+ return i;
+ }
+ return 0;
+}
+
void Parser::match(int kind, unsigned *token)
{
if (LA() == kind)
@@ -811,6 +823,9 @@ bool Parser::parseUsing(DeclarationAST *&node)
if (LA(2) == T_NAMESPACE)
return parseUsingDirective(node);
+ if (_cxx0xEnabled && LA(2) == T_IDENTIFIER && parseAliasDeclaration(node))
+ return true;
+
UsingAST *ast = new (_pool) UsingAST;
ast->using_token = consumeToken();
@@ -840,6 +855,37 @@ bool Parser::parseUsingDirective(DeclarationAST *&node)
return false;
}
+// alias-declaration = 'using' identifier attribute-specifier-seq(opt) '=' type-id ';'
+bool Parser::parseAliasDeclaration(DeclarationAST *&node)
+{
+ DEBUG_THIS_RULE();
+ if (LA() != T_USING || LA(2) != T_IDENTIFIER)
+ return false;
+
+ if (!find(T_EQUAL, T_SEMICOLON))
+ return false;
+
+ AliasDeclarationAST *alias = new (_pool) AliasDeclarationAST;
+ alias->using_token = consumeToken();
+ alias->identifier_token = consumeToken();
+
+ // ### attributes!
+ while (LA() != T_EQUAL)
+ consumeToken();
+
+ alias->equal_token = consumeToken();
+
+ ExpressionAST *expr = 0;
+ parseTypeId(expr);
+ if (expr)
+ alias->typeId = expr->asTypeId();
+
+ match(T_SEMICOLON, &alias->semicolon_token);
+
+ node = alias;
+ return true;
+}
+
bool Parser::parseConversionFunctionId(NameAST *&node)
{
DEBUG_THIS_RULE();
diff --git a/src/libs/3rdparty/cplusplus/Parser.h b/src/libs/3rdparty/cplusplus/Parser.h
index da472097c7a..cb0c7803c53 100644
--- a/src/libs/3rdparty/cplusplus/Parser.h
+++ b/src/libs/3rdparty/cplusplus/Parser.h
@@ -191,6 +191,7 @@ public:
bool parseUnqualifiedName(NameAST *&node, bool acceptTemplateId = true);
bool parseUsing(DeclarationAST *&node);
bool parseUsingDirective(DeclarationAST *&node);
+ bool parseAliasDeclaration(DeclarationAST *&node);
bool parseWhileStatement(StatementAST *&node);
void parseExpressionWithOperatorPrecedence(ExpressionAST *&lhs, int minPrecedence);
@@ -256,6 +257,7 @@ public:
void skipUntilDeclaration();
bool skipUntilStatement();
bool skip(int l, int r);
+ int find(int token, int stopAt);
bool lookAtTypeParameter() const;
bool lookAtCVQualifier() const;
diff --git a/tests/auto/cplusplus/cxx11/data/aliasDecl.1.cpp b/tests/auto/cplusplus/cxx11/data/aliasDecl.1.cpp
new file mode 100644
index 00000000000..99384acaa17
--- /dev/null
+++ b/tests/auto/cplusplus/cxx11/data/aliasDecl.1.cpp
@@ -0,0 +1,4 @@
+using Foo = int;
+using Bar = std::vector<int>::value_type;
+using A [[foo]] = const float;
+using B alignas(void*) = C *;
diff --git a/tests/auto/cplusplus/cxx11/tst_cxx11.cpp b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp
index 0d7a34a316d..aeb992aec27 100644
--- a/tests/auto/cplusplus/cxx11/tst_cxx11.cpp
+++ b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp
@@ -142,6 +142,7 @@ void tst_cxx11::parse_data()
QTest::newRow("refQualifier.1") << "refQualifier.1.cpp" << "";
QTest::newRow("alignofAlignas.1") << "alignofAlignas.1.cpp" << "";
QTest::newRow("rangeFor.1") << "rangeFor.1.cpp" << "";
+ QTest::newRow("aliasDecl.1") << "aliasDecl.1.cpp" << "";
}
void tst_cxx11::parse()
diff --git a/tests/tools/cplusplus-dump/dumpers.inc b/tests/tools/cplusplus-dump/dumpers.inc
index bcb4ae335e6..6585ffa7e88 100644
--- a/tests/tools/cplusplus-dump/dumpers.inc
+++ b/tests/tools/cplusplus-dump/dumpers.inc
@@ -848,6 +848,20 @@ virtual bool visit(NamespaceAliasDefinitionAST *ast)
return false;
}
+virtual bool visit(AliasDeclarationAST *ast)
+{
+ if (ast->using_token)
+ terminal(ast->using_token, ast);
+ if (ast->identifier_token)
+ terminal(ast->identifier_token, ast);
+ if (ast->equal_token)
+ terminal(ast->equal_token, ast);
+ nonterminal(ast->typeId);
+ if (ast->semicolon_token)
+ terminal(ast->semicolon_token, ast);
+ return false;
+}
+
virtual bool visit(ExpressionListParenAST *ast)
{
if (ast->lparen_token)