aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeandro Melo <leandro.melo@nokia.com>2011-11-18 13:33:26 +0100
committerLeandro Melo <leandro.melo@nokia.com>2011-11-18 13:50:19 +0100
commit057fad645bc16e8423579db6608120d59de40340 (patch)
treeb1d12874536678636b396a654c07c1613aabb518
parent64d579dc3a72ac22acf66bdcc882850b1a5de773 (diff)
C++: Recognize C++11 nullptr
Change-Id: I5b7ac8f9b2137ffe9439ada4ec4aeb9cee8e249d Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp16
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h23
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp7
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatch0.cpp8
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp10
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.h1
-rw-r--r--src/libs/3rdparty/cplusplus/ASTPatternBuilder.h6
-rw-r--r--src/libs/3rdparty/cplusplus/ASTVisit.cpp7
-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.cpp7
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.h1
-rw-r--r--src/libs/3rdparty/cplusplus/Keywords.cpp17
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp17
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.h1
-rw-r--r--src/libs/3rdparty/cplusplus/Token.h1
-rw-r--r--src/libs/cplusplus/FindUsages.cpp7
-rw-r--r--src/libs/cplusplus/FindUsages.h1
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp7
-rw-r--r--src/libs/cplusplus/ResolveExpression.h1
20 files changed, 140 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,
diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp
index 68ea4e563f..08b861f012 100644
--- a/src/libs/cplusplus/FindUsages.cpp
+++ b/src/libs/cplusplus/FindUsages.cpp
@@ -1351,6 +1351,13 @@ bool FindUsages::visit(SizeofExpressionAST *ast)
return false;
}
+bool FindUsages::visit(PointerLiteralAST *ast)
+{
+ (void) ast;
+ // unsigned literal_token = ast->literal_token;
+ return false;
+}
+
bool FindUsages::visit(NumericLiteralAST *ast)
{
(void) ast;
diff --git a/src/libs/cplusplus/FindUsages.h b/src/libs/cplusplus/FindUsages.h
index d5d877214e..a423be0996 100644
--- a/src/libs/cplusplus/FindUsages.h
+++ b/src/libs/cplusplus/FindUsages.h
@@ -202,6 +202,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/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 1490321076..9caa14aec9 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -273,6 +273,13 @@ bool ResolveExpression::visit(SizeofExpressionAST *)
return false;
}
+bool ResolveExpression::visit(PointerLiteralAST *)
+{
+ FullySpecifiedType ty(control()->integerType(IntegerType::Int)); // Handling as Int.
+ addResult(ty, _scope);
+ return false;
+}
+
bool ResolveExpression::visit(NumericLiteralAST *ast)
{
const Token &tk = tokenAt(ast->literal_token);
diff --git a/src/libs/cplusplus/ResolveExpression.h b/src/libs/cplusplus/ResolveExpression.h
index 2d4ad49d6b..1b1128a834 100644
--- a/src/libs/cplusplus/ResolveExpression.h
+++ b/src/libs/cplusplus/ResolveExpression.h
@@ -91,6 +91,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);