diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2012-02-02 10:19:58 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2012-02-02 11:07:20 +0100 |
commit | 13dd213f60011cec3a0ee11f557ab56bf7efd3ce (patch) | |
tree | d0d7c2ca28b11e4115f6676731fe4b63e70dda7f /src/libs | |
parent | c27a463fe71d0eef0dc2c4931d6ab102cd7d216f (diff) |
C++11: handle inline namespaces.
Change-Id: Iafdcd5bc72d9724e217767ae9c216be4363cc0d3
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.cpp | 4 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.h | 4 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTClone.cpp | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatcher.cpp | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 14 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.cpp | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.h | 9 |
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 |