aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2012-02-02 10:19:58 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2012-02-02 11:07:20 +0100
commit13dd213f60011cec3a0ee11f557ab56bf7efd3ce (patch)
treed0d7c2ca28b11e4115f6676731fe4b63e70dda7f
parentc27a463fe71d0eef0dc2c4931d6ab102cd7d216f (diff)
C++11: handle inline namespaces.
Change-Id: Iafdcd5bc72d9724e217767ae9c216be4363cc0d3 Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp4
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h4
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp1
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp2
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.cpp1
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp14
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.cpp2
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.h9
8 files changed, 35 insertions, 2 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp
index 342ed297aff..2669fa578ea 100644
--- a/src/libs/3rdparty/cplusplus/AST.cpp
+++ b/src/libs/3rdparty/cplusplus/AST.cpp
@@ -1817,6 +1817,8 @@ unsigned NamedTypeSpecifierAST::lastToken() const
/** \generated */
unsigned NamespaceAST::firstToken() const
{
+ if (inline_token)
+ return inline_token;
if (namespace_token)
return namespace_token;
if (identifier_token)
@@ -1843,6 +1845,8 @@ unsigned NamespaceAST::lastToken() const
return identifier_token + 1;
if (namespace_token)
return namespace_token + 1;
+ if (inline_token)
+ return inline_token + 1;
return 1;
}
diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h
index 738bb70871b..015080f45eb 100644
--- a/src/libs/3rdparty/cplusplus/AST.h
+++ b/src/libs/3rdparty/cplusplus/AST.h
@@ -2223,6 +2223,7 @@ protected:
class CPLUSPLUS_EXPORT NamespaceAST: public DeclarationAST
{
public:
+ unsigned inline_token;
unsigned namespace_token;
unsigned identifier_token;
SpecifierListAST *attribute_list;
@@ -2233,7 +2234,8 @@ public: // annotations
public:
NamespaceAST()
- : namespace_token(0)
+ : inline_token(0)
+ , namespace_token(0)
, identifier_token(0)
, attribute_list(0)
, linkage_body(0)
diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp
index fe6b8ffacc5..961237d0ba3 100644
--- a/src/libs/3rdparty/cplusplus/ASTClone.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp
@@ -810,6 +810,7 @@ TemplateIdAST *TemplateIdAST::clone(MemoryPool *pool) const
NamespaceAST *NamespaceAST::clone(MemoryPool *pool) const
{
NamespaceAST *ast = new (pool) NamespaceAST;
+ ast->inline_token = inline_token;
ast->namespace_token = namespace_token;
ast->identifier_token = identifier_token;
for (SpecifierListAST *iter = attribute_list, **ast_iter = &ast->attribute_list;
diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
index 28dc79bd7fe..b29f5704326 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
@@ -1368,6 +1368,8 @@ bool ASTMatcher::match(NamespaceAST *node, NamespaceAST *pattern)
(void) node;
(void) pattern;
+ pattern->inline_token = node->inline_token;
+
pattern->namespace_token = node->namespace_token;
pattern->identifier_token = node->identifier_token;
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp
index 13a819a19f4..ec5f5d7c8ad 100644
--- a/src/libs/3rdparty/cplusplus/Bind.cpp
+++ b/src/libs/3rdparty/cplusplus/Bind.cpp
@@ -2123,6 +2123,7 @@ bool Bind::visit(NamespaceAST *ast)
Namespace *ns = control()->newNamespace(sourceLocation, namespaceName);
ns->setStartOffset(tokenAt(sourceLocation).end()); // the scope starts after the namespace or the identifier token.
ns->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+ ns->setInline(ast->inline_token != 0);
ast->symbol = ns;
_scope->addMember(ns);
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index c1e959db4c7..ede5392ddac 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -621,6 +621,11 @@ bool Parser::parseDeclaration(DeclarationAST *&node)
consumeToken();
break;
+ case T_INLINE:
+ if (_cxx0xEnabled && LA(2) == T_NAMESPACE)
+ return parseNamespace(node);
+ // else: intentionally fall-through
+
default: {
if (_objCEnabled && LA() == T___ATTRIBUTE__) {
const unsigned start = cursor();
@@ -706,12 +711,18 @@ bool Parser::parseLinkageBody(DeclarationAST *&node)
bool Parser::parseNamespace(DeclarationAST *&node)
{
DEBUG_THIS_RULE();
- if (LA() != T_NAMESPACE)
+ if (LA() != T_NAMESPACE && !(_cxx0xEnabled && LA() == T_INLINE && LA(2) == T_NAMESPACE))
return false;
+ unsigned inline_token = 0;
+ if (cxx0xEnabled() && LA() == T_INLINE)
+ inline_token = consumeToken();
+
unsigned namespace_token = consumeToken();
if (LA() == T_IDENTIFIER && LA(2) == T_EQUAL) {
+ if (inline_token)
+ warning(inline_token, "namespace alias cannot be inline");
NamespaceAliasDefinitionAST *ast =
new (_pool) NamespaceAliasDefinitionAST;
ast->namespace_token = namespace_token;
@@ -724,6 +735,7 @@ bool Parser::parseNamespace(DeclarationAST *&node)
}
NamespaceAST *ast = new (_pool) NamespaceAST;
+ ast->inline_token = inline_token;
ast->namespace_token = namespace_token;
if (LA() == T_IDENTIFIER)
ast->identifier_token = consumeToken();
diff --git a/src/libs/3rdparty/cplusplus/Symbols.cpp b/src/libs/3rdparty/cplusplus/Symbols.cpp
index be4dd85e9fd..e7af2981b08 100644
--- a/src/libs/3rdparty/cplusplus/Symbols.cpp
+++ b/src/libs/3rdparty/cplusplus/Symbols.cpp
@@ -555,10 +555,12 @@ bool Template::matchType0(const Type *otherType, TypeMatcher *matcher) const
Namespace::Namespace(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
: Scope(translationUnit, sourceLocation, name)
+ , _isInline(false)
{ }
Namespace::Namespace(Clone *clone, Subst *subst, Namespace *original)
: Scope(clone, subst, original)
+ , _isInline(original->_isInline)
{ }
Namespace::~Namespace()
diff --git a/src/libs/3rdparty/cplusplus/Symbols.h b/src/libs/3rdparty/cplusplus/Symbols.h
index ec65e926f7c..2d1d5158f44 100644
--- a/src/libs/3rdparty/cplusplus/Symbols.h
+++ b/src/libs/3rdparty/cplusplus/Symbols.h
@@ -445,10 +445,19 @@ public:
virtual Namespace *asNamespaceType()
{ return this; }
+ bool isInline() const
+ { return _isInline; }
+
+ void setInline(bool onoff)
+ { _isInline = onoff; }
+
protected:
virtual void visitSymbol0(SymbolVisitor *visitor);
virtual void accept0(TypeVisitor *visitor);
virtual bool matchType0(const Type *otherType, TypeMatcher *matcher) const;
+
+private:
+ bool _isInline;
};
class CPLUSPLUS_EXPORT BaseClass: public Symbol