diff options
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.cpp | 30 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.h | 29 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTClone.cpp | 11 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatch0.cpp | 8 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatcher.cpp | 19 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatcher.h | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTPatternBuilder.h | 7 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTVisit.cpp | 8 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTVisitor.h | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTfwd.h | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 6 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.h | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Keywords.cpp | 19 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 12 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Token.cpp | 3 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Token.h | 3 |
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, |