diff options
author | Leandro Melo <leandro.melo@nokia.com> | 2011-11-18 13:33:26 +0100 |
---|---|---|
committer | Leandro Melo <leandro.melo@nokia.com> | 2011-11-18 13:50:19 +0100 |
commit | 057fad645bc16e8423579db6608120d59de40340 (patch) | |
tree | b1d12874536678636b396a654c07c1613aabb518 /src/libs/3rdparty/cplusplus | |
parent | 64d579dc3a72ac22acf66bdcc882850b1a5de773 (diff) |
C++: Recognize C++11 nullptr
Change-Id: I5b7ac8f9b2137ffe9439ada4ec4aeb9cee8e249d
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.cpp | 16 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.h | 23 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTClone.cpp | 7 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatch0.cpp | 8 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatcher.cpp | 10 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatcher.h | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTPatternBuilder.h | 6 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTVisit.cpp | 7 | ||||
-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 | 7 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.h | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Keywords.cpp | 17 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 17 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.h | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Token.h | 1 |
16 files changed, 124 insertions, 1 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp index c9fdea27c7..342ed297af 100644 --- a/src/libs/3rdparty/cplusplus/AST.cpp +++ b/src/libs/3rdparty/cplusplus/AST.cpp @@ -4219,3 +4219,19 @@ unsigned AttributeSpecifierAST::lastToken() const return 1; } +/** \generated */ +unsigned PointerLiteralAST::firstToken() const +{ + if (literal_token) + return literal_token; + return 0; +} + +/** \generated */ +unsigned PointerLiteralAST::lastToken() const +{ + if (literal_token) + return literal_token + 1; + return 1; +} + diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index 6ec89a5625..738bb70871 100644 --- a/src/libs/3rdparty/cplusplus/AST.h +++ b/src/libs/3rdparty/cplusplus/AST.h @@ -227,6 +227,7 @@ public: virtual ParameterDeclarationAST *asParameterDeclaration() { return 0; } virtual ParameterDeclarationClauseAST *asParameterDeclarationClause() { return 0; } virtual PointerAST *asPointer() { return 0; } + virtual PointerLiteralAST *asPointerLiteral() { return 0; } virtual PointerToMemberAST *asPointerToMember() { return 0; } virtual PostIncrDecrAST *asPostIncrDecr() { return 0; } virtual PostfixAST *asPostfix() { return 0; } @@ -2904,6 +2905,28 @@ protected: virtual bool match0(AST *, ASTMatcher *); }; +class CPLUSPLUS_EXPORT PointerLiteralAST: public ExpressionAST +{ +public: + unsigned literal_token; + +public: + PointerLiteralAST() + : literal_token(0) + {} + + virtual PointerLiteralAST *asPointerLiteral() { return this; } + + virtual unsigned firstToken() const; + virtual unsigned lastToken() const; + + virtual PointerLiteralAST *clone(MemoryPool *pool) const; + +protected: + virtual void accept0(ASTVisitor *visitor); + virtual bool match0(AST *, ASTMatcher *); +}; + class CPLUSPLUS_EXPORT NumericLiteralAST: public ExpressionAST { public: diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp index 2c2d3a9915..fe6b8ffacc 100644 --- a/src/libs/3rdparty/cplusplus/ASTClone.cpp +++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp @@ -1092,6 +1092,13 @@ SizeofExpressionAST *SizeofExpressionAST::clone(MemoryPool *pool) const return ast; } +PointerLiteralAST *PointerLiteralAST::clone(MemoryPool *pool) const +{ + PointerLiteralAST *ast = new (pool) PointerLiteralAST; + ast->literal_token = literal_token; + return ast; +} + NumericLiteralAST *NumericLiteralAST::clone(MemoryPool *pool) const { NumericLiteralAST *ast = new (pool) NumericLiteralAST; diff --git a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp index 3b6f730ef8..67d29dee5a 100644 --- a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp +++ b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp @@ -752,6 +752,14 @@ bool SizeofExpressionAST::match0(AST *pattern, ASTMatcher *matcher) return false; } +bool PointerLiteralAST::match0(AST *pattern, ASTMatcher *matcher) +{ + if (PointerLiteralAST *_other = pattern->asPointerLiteral()) + return matcher->match(this, _other); + + return false; +} + bool NumericLiteralAST::match0(AST *pattern, ASTMatcher *matcher) { if (NumericLiteralAST *_other = pattern->asNumericLiteral()) diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp index 69ef885e8c..28dc79bd7f 100644 --- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp +++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp @@ -1839,6 +1839,16 @@ bool ASTMatcher::match(SizeofExpressionAST *node, SizeofExpressionAST *pattern) return true; } +bool ASTMatcher::match(PointerLiteralAST *node, PointerLiteralAST *pattern) +{ + (void) node; + (void) pattern; + + pattern->literal_token = node->literal_token; + + return true; +} + bool ASTMatcher::match(NumericLiteralAST *node, NumericLiteralAST *pattern) { (void) node; diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.h b/src/libs/3rdparty/cplusplus/ASTMatcher.h index 0f826aee00..8bb12a9f08 100644 --- a/src/libs/3rdparty/cplusplus/ASTMatcher.h +++ b/src/libs/3rdparty/cplusplus/ASTMatcher.h @@ -130,6 +130,7 @@ public: virtual bool match(ParameterDeclarationAST *node, ParameterDeclarationAST *pattern); virtual bool match(ParameterDeclarationClauseAST *node, ParameterDeclarationClauseAST *pattern); virtual bool match(PointerAST *node, PointerAST *pattern); + virtual bool match(PointerLiteralAST *node, PointerLiteralAST *pattern); virtual bool match(PointerToMemberAST *node, PointerToMemberAST *pattern); virtual bool match(PostIncrDecrAST *node, PostIncrDecrAST *pattern); virtual bool match(QtEnumDeclarationAST *node, QtEnumDeclarationAST *pattern); diff --git a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h index 208e99f1d4..2264f22151 100644 --- a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h +++ b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h @@ -721,6 +721,12 @@ public: return __ast; } + PointerLiteralAST *PointerLiteral() + { + PointerLiteralAST *__ast = new (&pool) PointerLiteralAST; + return __ast; + } + NumericLiteralAST *NumericLiteral() { NumericLiteralAST *__ast = new (&pool) NumericLiteralAST; diff --git a/src/libs/3rdparty/cplusplus/ASTVisit.cpp b/src/libs/3rdparty/cplusplus/ASTVisit.cpp index f4e6e3b140..9d82fb13c9 100644 --- a/src/libs/3rdparty/cplusplus/ASTVisit.cpp +++ b/src/libs/3rdparty/cplusplus/ASTVisit.cpp @@ -799,6 +799,13 @@ void SizeofExpressionAST::accept0(ASTVisitor *visitor) visitor->endVisit(this); } +void PointerLiteralAST::accept0(ASTVisitor *visitor) +{ + if (visitor->visit(this)) { + } + visitor->endVisit(this); +} + void NumericLiteralAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { diff --git a/src/libs/3rdparty/cplusplus/ASTVisitor.h b/src/libs/3rdparty/cplusplus/ASTVisitor.h index 5508b775a2..bad818dfa7 100644 --- a/src/libs/3rdparty/cplusplus/ASTVisitor.h +++ b/src/libs/3rdparty/cplusplus/ASTVisitor.h @@ -172,6 +172,7 @@ public: virtual bool visit(ParameterDeclarationAST *) { return true; } virtual bool visit(ParameterDeclarationClauseAST *) { return true; } virtual bool visit(PointerAST *) { return true; } + virtual bool visit(PointerLiteralAST *) { return true; } virtual bool visit(PointerToMemberAST *) { return true; } virtual bool visit(PostIncrDecrAST *) { return true; } virtual bool visit(QtEnumDeclarationAST *) { return true; } @@ -311,6 +312,7 @@ public: virtual void endVisit(ParameterDeclarationAST *) {} virtual void endVisit(ParameterDeclarationClauseAST *) {} virtual void endVisit(PointerAST *) {} + virtual void endVisit(PointerLiteralAST *) {} virtual void endVisit(PointerToMemberAST *) {} virtual void endVisit(PostIncrDecrAST *) {} virtual void endVisit(QtEnumDeclarationAST *) {} diff --git a/src/libs/3rdparty/cplusplus/ASTfwd.h b/src/libs/3rdparty/cplusplus/ASTfwd.h index 656905222f..b1f529ca39 100644 --- a/src/libs/3rdparty/cplusplus/ASTfwd.h +++ b/src/libs/3rdparty/cplusplus/ASTfwd.h @@ -134,6 +134,7 @@ class OperatorFunctionIdAST; class ParameterDeclarationAST; class ParameterDeclarationClauseAST; class PointerAST; +class PointerLiteralAST; class PointerToMemberAST; class PostIncrDecrAST; class PostfixAST; diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index 7301686882..435e01dfe5 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -1594,6 +1594,13 @@ bool Bind::visit(SizeofExpressionAST *ast) return false; } +bool Bind::visit(PointerLiteralAST *ast) +{ + (void) ast; + // unsigned literal_token = ast->literal_token; + return false; +} + bool Bind::visit(NumericLiteralAST *ast) { (void) ast; diff --git a/src/libs/3rdparty/cplusplus/Bind.h b/src/libs/3rdparty/cplusplus/Bind.h index 8a0853f3d6..b480e0582f 100644 --- a/src/libs/3rdparty/cplusplus/Bind.h +++ b/src/libs/3rdparty/cplusplus/Bind.h @@ -183,6 +183,7 @@ protected: virtual bool visit(TypenameCallExpressionAST *ast); virtual bool visit(TypeConstructorCallAST *ast); virtual bool visit(SizeofExpressionAST *ast); + virtual bool visit(PointerLiteralAST *ast); virtual bool visit(NumericLiteralAST *ast); virtual bool visit(BoolLiteralAST *ast); virtual bool visit(ThisExpressionAST *ast); diff --git a/src/libs/3rdparty/cplusplus/Keywords.cpp b/src/libs/3rdparty/cplusplus/Keywords.cpp index 003566c414..a87a4bd7a9 100644 --- a/src/libs/3rdparty/cplusplus/Keywords.cpp +++ b/src/libs/3rdparty/cplusplus/Keywords.cpp @@ -530,7 +530,7 @@ static inline int classify6(const char *s, bool q, bool) { return T_IDENTIFIER; } -static inline int classify7(const char *s, bool q, bool) { +static inline int classify7(const char *s, bool q, bool x) { if (s[0] == '_') { if (s[1] == '_') { if (s[2] == 'a') { @@ -587,6 +587,21 @@ static inline int classify7(const char *s, bool q, bool) { } } } + else if (x && s[0] == 'n') { + if (s[1] == 'u') { + if (s[2] == 'l') { + if (s[3] == 'l') { + if (s[4] == 'p') { + if (s[5] == 't') { + if (s[6] == 'r') { + return T_NULLPTR; + } + } + } + } + } + } + } else if (s[0] == 'p') { if (s[1] == 'r') { if (s[2] == 'i') { diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index f89596cf08..c1e959db4c 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -3865,6 +3865,18 @@ bool Parser::parseNumericLiteral(ExpressionAST *&node) return false; } +bool Parser::parsePointerLiteral(ExpressionAST *&node) +{ + DEBUG_THIS_RULE(); + if (LA() == T_NULLPTR) { + PointerLiteralAST *ast = new (_pool) PointerLiteralAST; + ast->literal_token = consumeToken(); + node = ast; + return true; + } + return false; +} + bool Parser::parseThisExpression(ExpressionAST *&node) { DEBUG_THIS_RULE(); @@ -3885,6 +3897,11 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node) case T_WIDE_STRING_LITERAL: return parseStringLiteral(node); + case T_NULLPTR: + if (_cxx0xEnabled) + return parsePointerLiteral(node); + // fall-through + case T_CHAR_LITERAL: // ### FIXME don't use NumericLiteral for chars case T_WIDE_CHAR_LITERAL: case T_NUMERIC_LITERAL: diff --git a/src/libs/3rdparty/cplusplus/Parser.h b/src/libs/3rdparty/cplusplus/Parser.h index 1deb6269c0..de2acfcb54 100644 --- a/src/libs/3rdparty/cplusplus/Parser.h +++ b/src/libs/3rdparty/cplusplus/Parser.h @@ -153,6 +153,7 @@ public: bool parseThisExpression(ExpressionAST *&node); bool parseBoolLiteral(ExpressionAST *&node); bool parseNumericLiteral(ExpressionAST *&node); + bool parsePointerLiteral(ExpressionAST *&node); bool parseStringLiteral(ExpressionAST *&node); bool parseSwitchStatement(StatementAST *&node); bool parseTemplateArgument(ExpressionAST *&node); diff --git a/src/libs/3rdparty/cplusplus/Token.h b/src/libs/3rdparty/cplusplus/Token.h index 88de833e31..495e632e23 100644 --- a/src/libs/3rdparty/cplusplus/Token.h +++ b/src/libs/3rdparty/cplusplus/Token.h @@ -135,6 +135,7 @@ enum Kind { T_MUTABLE, T_NAMESPACE, T_NEW, + T_NULLPTR, T_OPERATOR, T_PRIVATE, T_PROTECTED, |