summaryrefslogtreecommitdiff
path: root/src/libs/3rdparty/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp30
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h29
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp11
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatch0.cpp8
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp19
-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/Bind.cpp6
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.h1
-rw-r--r--src/libs/3rdparty/cplusplus/Keywords.cpp19
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp12
-rw-r--r--src/libs/3rdparty/cplusplus/Token.cpp3
-rw-r--r--src/libs/3rdparty/cplusplus/Token.h3
16 files changed, 158 insertions, 2 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp
index 109cc63455..445afe8123 100644
--- a/src/libs/3rdparty/cplusplus/AST.cpp
+++ b/src/libs/3rdparty/cplusplus/AST.cpp
@@ -4313,3 +4313,33 @@ unsigned StaticAssertDeclarationAST::lastToken() const
return 1;
}
+/** \generated */
+unsigned DecltypeSpecifierAST::firstToken() const
+{
+ if (decltype_token)
+ return decltype_token;
+ 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 DecltypeSpecifierAST::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;
+ if (decltype_token)
+ return decltype_token + 1;
+ return 1;
+}
+
diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h
index c6939876e6..f02cce10da 100644
--- a/src/libs/3rdparty/cplusplus/AST.h
+++ b/src/libs/3rdparty/cplusplus/AST.h
@@ -156,6 +156,7 @@ public:
virtual DeclarationStatementAST *asDeclarationStatement() { return 0; }
virtual DeclaratorAST *asDeclarator() { return 0; }
virtual DeclaratorIdAST *asDeclaratorId() { return 0; }
+ virtual DecltypeSpecifierAST *asDecltypeSpecifier() { return 0; }
virtual DeleteExpressionAST *asDeleteExpression() { return 0; }
virtual DestructorNameAST *asDestructorName() { return 0; }
virtual DoStatementAST *asDoStatement() { return 0; }
@@ -542,6 +543,34 @@ protected:
virtual bool match0(AST *, ASTMatcher *);
};
+class CPLUSPLUS_EXPORT DecltypeSpecifierAST: public SpecifierAST
+{
+public:
+ unsigned decltype_token;
+ unsigned lparen_token;
+ ExpressionAST *expression;
+ unsigned rparen_token;
+
+public:
+ DecltypeSpecifierAST()
+ : decltype_token(0)
+ , lparen_token(0)
+ , expression(0)
+ , rparen_token(0)
+ {}
+
+ virtual DecltypeSpecifierAST *asDecltypeSpecifier() { return this; }
+
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+ virtual DecltypeSpecifierAST *clone(MemoryPool *pool) const;
+
+protected:
+ virtual void accept0(ASTVisitor *visitor);
+ virtual bool match0(AST *, ASTMatcher *);
+};
+
class CPLUSPLUS_EXPORT DeclaratorAST: public AST
{
public:
diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp
index e65be49c38..6d77e7e3da 100644
--- a/src/libs/3rdparty/cplusplus/ASTClone.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp
@@ -93,6 +93,17 @@ TypeofSpecifierAST *TypeofSpecifierAST::clone(MemoryPool *pool) const
return ast;
}
+DecltypeSpecifierAST *DecltypeSpecifierAST::clone(MemoryPool *pool) const
+{
+ DecltypeSpecifierAST *ast = new (pool) DecltypeSpecifierAST;
+ ast->decltype_token = decltype_token;
+ ast->lparen_token = lparen_token;
+ if (expression)
+ ast->expression = expression->clone(pool);
+ ast->rparen_token = rparen_token;
+ return ast;
+}
+
DeclaratorAST *DeclaratorAST::clone(MemoryPool *pool) const
{
DeclaratorAST *ast = new (pool) DeclaratorAST;
diff --git a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp
index 127993ea2a..e94a5eec60 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp
@@ -80,6 +80,14 @@ bool TypeofSpecifierAST::match0(AST *pattern, ASTMatcher *matcher)
return false;
}
+bool DecltypeSpecifierAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+ if (DecltypeSpecifierAST *_other = pattern->asDecltypeSpecifier())
+ return matcher->match(this, _other);
+
+ return false;
+}
+
bool DeclaratorAST::match0(AST *pattern, ASTMatcher *matcher)
{
if (DeclaratorAST *_other = pattern->asDeclarator())
diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
index daafb070b1..15595ac170 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
@@ -136,6 +136,25 @@ bool ASTMatcher::match(TypeofSpecifierAST *node, TypeofSpecifierAST *pattern)
return true;
}
+bool ASTMatcher::match(DecltypeSpecifierAST *node, DecltypeSpecifierAST *pattern)
+{
+ (void) node;
+ (void) pattern;
+
+ pattern->decltype_token = node->decltype_token;
+
+ 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(DeclaratorAST *node, DeclaratorAST *pattern)
{
(void) node;
diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.h b/src/libs/3rdparty/cplusplus/ASTMatcher.h
index 4c8612ccdc..1e32dababe 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatcher.h
+++ b/src/libs/3rdparty/cplusplus/ASTMatcher.h
@@ -61,6 +61,7 @@ public:
virtual bool match(DeclarationStatementAST *node, DeclarationStatementAST *pattern);
virtual bool match(DeclaratorAST *node, DeclaratorAST *pattern);
virtual bool match(DeclaratorIdAST *node, DeclaratorIdAST *pattern);
+ virtual bool match(DecltypeSpecifierAST *node, DecltypeSpecifierAST *pattern);
virtual bool match(DeleteExpressionAST *node, DeleteExpressionAST *pattern);
virtual bool match(DestructorNameAST *node, DestructorNameAST *pattern);
virtual bool match(DoStatementAST *node, DoStatementAST *pattern);
diff --git a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
index cbc2ccdaf8..dce4608cde 100644
--- a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
+++ b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
@@ -84,6 +84,13 @@ public:
return __ast;
}
+ DecltypeSpecifierAST *DecltypeSpecifier(ExpressionAST *expression = 0)
+ {
+ DecltypeSpecifierAST *__ast = new (&pool) DecltypeSpecifierAST;
+ __ast->expression = expression;
+ return __ast;
+ }
+
DeclaratorAST *Declarator(SpecifierListAST *attribute_list = 0, PtrOperatorListAST *ptr_operator_list = 0, CoreDeclaratorAST *core_declarator = 0, PostfixDeclaratorListAST *postfix_declarator_list = 0, SpecifierListAST *post_attribute_list = 0, ExpressionAST *initializer = 0)
{
DeclaratorAST *__ast = new (&pool) DeclaratorAST;
diff --git a/src/libs/3rdparty/cplusplus/ASTVisit.cpp b/src/libs/3rdparty/cplusplus/ASTVisit.cpp
index 2e99c3155a..5d7ab2511d 100644
--- a/src/libs/3rdparty/cplusplus/ASTVisit.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTVisit.cpp
@@ -78,6 +78,14 @@ void TypeofSpecifierAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this);
}
+void DecltypeSpecifierAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ accept(expression, visitor);
+ }
+ visitor->endVisit(this);
+}
+
void DeclaratorAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
diff --git a/src/libs/3rdparty/cplusplus/ASTVisitor.h b/src/libs/3rdparty/cplusplus/ASTVisitor.h
index 9ca6cf57f6..599634090c 100644
--- a/src/libs/3rdparty/cplusplus/ASTVisitor.h
+++ b/src/libs/3rdparty/cplusplus/ASTVisitor.h
@@ -103,6 +103,7 @@ public:
virtual bool visit(DeclarationStatementAST *) { return true; }
virtual bool visit(DeclaratorAST *) { return true; }
virtual bool visit(DeclaratorIdAST *) { return true; }
+ virtual bool visit(DecltypeSpecifierAST *) { return true; }
virtual bool visit(DeleteExpressionAST *) { return true; }
virtual bool visit(DestructorNameAST *) { return true; }
virtual bool visit(DoStatementAST *) { return true; }
@@ -245,6 +246,7 @@ public:
virtual void endVisit(DeclarationStatementAST *) {}
virtual void endVisit(DeclaratorAST *) {}
virtual void endVisit(DeclaratorIdAST *) {}
+ virtual void endVisit(DecltypeSpecifierAST *) {}
virtual void endVisit(DeleteExpressionAST *) {}
virtual void endVisit(DestructorNameAST *) {}
virtual void endVisit(DoStatementAST *) {}
diff --git a/src/libs/3rdparty/cplusplus/ASTfwd.h b/src/libs/3rdparty/cplusplus/ASTfwd.h
index 9858a42ab2..b2036c0672 100644
--- a/src/libs/3rdparty/cplusplus/ASTfwd.h
+++ b/src/libs/3rdparty/cplusplus/ASTfwd.h
@@ -63,6 +63,7 @@ class DeclarationAST;
class DeclarationStatementAST;
class DeclaratorAST;
class DeclaratorIdAST;
+class DecltypeSpecifierAST;
class DeleteExpressionAST;
class DestructorNameAST;
class DoStatementAST;
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp
index e78636366f..1d33812d0e 100644
--- a/src/libs/3rdparty/cplusplus/Bind.cpp
+++ b/src/libs/3rdparty/cplusplus/Bind.cpp
@@ -2799,6 +2799,12 @@ bool Bind::visit(TypeofSpecifierAST *ast)
return false;
}
+bool Bind::visit(DecltypeSpecifierAST *ast)
+{
+ _type = this->expression(ast->expression);
+ return false;
+}
+
bool Bind::visit(ClassSpecifierAST *ast)
{
// unsigned classkey_token = ast->classkey_token;
diff --git a/src/libs/3rdparty/cplusplus/Bind.h b/src/libs/3rdparty/cplusplus/Bind.h
index 6a2820d3d4..66d8ed2a0d 100644
--- a/src/libs/3rdparty/cplusplus/Bind.h
+++ b/src/libs/3rdparty/cplusplus/Bind.h
@@ -245,6 +245,7 @@ protected:
virtual bool visit(SimpleSpecifierAST *ast);
virtual bool visit(AttributeSpecifierAST *ast);
virtual bool visit(TypeofSpecifierAST *ast);
+ virtual bool visit(DecltypeSpecifierAST *ast);
virtual bool visit(ClassSpecifierAST *ast);
virtual bool visit(NamedTypeSpecifierAST *ast);
virtual bool visit(ElaboratedTypeSpecifierAST *ast);
diff --git a/src/libs/3rdparty/cplusplus/Keywords.cpp b/src/libs/3rdparty/cplusplus/Keywords.cpp
index 49c7e442d0..fd5fc7d112 100644
--- a/src/libs/3rdparty/cplusplus/Keywords.cpp
+++ b/src/libs/3rdparty/cplusplus/Keywords.cpp
@@ -788,7 +788,7 @@ static inline int classify8(const char *s, bool q, bool x) {
if (s[5] == 'y') {
if (s[6] == 'p') {
if (s[7] == 'e') {
- return T___TYPEOF;
+ return T_DECLTYPE;
}
}
}
@@ -1110,6 +1110,23 @@ static inline int classify10(const char *s, bool q, bool) {
}
}
}
+ else if (s[2] == 'd') {
+ if (s[3] == 'e') {
+ if (s[4] == 'c') {
+ if (s[5] == 'l') {
+ if (s[6] == 't') {
+ if (s[7] == 'y') {
+ if (s[8] == 'p') {
+ if (s[9] == 'e') {
+ return T___DECLTYPE;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
else if (s[2] == 't') {
if (s[3] == 'y') {
if (s[4] == 'p') {
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index a8c8be7979..ca77a8b5d7 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -3483,6 +3483,7 @@ bool Parser::lookAtBuiltinTypeSpecifier() const
case T_DOUBLE:
case T_VOID:
case T_AUTO:
+ case T_DECLTYPE:
return true;
// [gcc] extensions
case T___TYPEOF__:
@@ -3579,6 +3580,17 @@ bool Parser::parseBuiltinTypeSpecifier(SpecifierListAST *&node)
parseUnaryExpression(ast->expression);
node = new (_pool) SpecifierListAST(ast);
return true;
+ } else if (LA() == T_DECLTYPE) {
+ DecltypeSpecifierAST *ast = new (_pool) DecltypeSpecifierAST;
+ ast->decltype_token = consumeToken();
+ match(T_LPAREN, &ast->lparen_token);
+ if (parseExpression(ast->expression)) {
+ match(T_RPAREN, &ast->rparen_token);
+ node = new (_pool) SpecifierListAST(ast);
+ return true;
+ }
+ skipUntilDeclaration();
+ return true;
} else if (lookAtBuiltinTypeSpecifier()) {
SimpleSpecifierAST *ast = new (_pool) SimpleSpecifierAST;
ast->specifier_token = consumeToken();
diff --git a/src/libs/3rdparty/cplusplus/Token.cpp b/src/libs/3rdparty/cplusplus/Token.cpp
index 1ebb54070a..24b3178756 100644
--- a/src/libs/3rdparty/cplusplus/Token.cpp
+++ b/src/libs/3rdparty/cplusplus/Token.cpp
@@ -41,7 +41,8 @@ static const char *token_names[] = {
("]"), (")"), (";"), ("*"), ("*="), ("~"), ("~="),
("asm"), ("auto"), ("bool"), ("break"), ("case"), ("catch"), ("char"),
- ("class"), ("const"), ("const_cast"), ("constexpr"), ("continue"), ("default"),
+ ("class"), ("const"), ("const_cast"), ("constexpr"), ("continue"),
+ ("decltype"), ("default"),
("delete"), ("do"), ("double"), ("dynamic_cast"), ("else"), ("enum"),
("explicit"), ("export"), ("extern"), ("false"), ("float"), ("for"),
("friend"), ("goto"), ("if"), ("inline"), ("int"), ("long"),
diff --git a/src/libs/3rdparty/cplusplus/Token.h b/src/libs/3rdparty/cplusplus/Token.h
index 7a2d13264e..e1c2a2aac8 100644
--- a/src/libs/3rdparty/cplusplus/Token.h
+++ b/src/libs/3rdparty/cplusplus/Token.h
@@ -113,6 +113,7 @@ enum Kind {
T_CONST_CAST,
T_CONSTEXPR,
T_CONTINUE,
+ T_DECLTYPE,
T_DEFAULT,
T_DELETE,
T_DO,
@@ -245,6 +246,8 @@ enum Kind {
T_TYPEOF = T___TYPEOF__,
T___TYPEOF = T___TYPEOF__,
+ T___DECLTYPE = T_DECLTYPE,
+
T___INLINE = T_INLINE,
T___INLINE__ = T_INLINE,