aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Duquesnoy <colin.duquesnoy@gmail.com>2018-02-04 16:24:57 +0100
committerColin Duquesnoy <colin.duquesnoy@gmail.com>2018-02-09 17:54:30 +0000
commit2a016d05b2eabdeaab6ce97e203f46fc8f8accce (patch)
tree2a9e12115940cf019a07eede0432b64a19a9fc73
parent7cf1ba2855691c5abe3763a872f2ed98a477c1fc (diff)
Add support for nested namespaces (C++17)
Task-number: QTCREATORBUG-16774 Change-Id: I3de3ac65810213e21c9a3bafef2474d252e191f7 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp23
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.h3
-rw-r--r--tests/auto/cplusplus/cxx11/cxx11.pro2
-rw-r--r--tests/auto/cplusplus/cxx11/data/nestedNamespace.1.cpp7
-rw-r--r--tests/auto/cplusplus/cxx11/data/nestedNamespace.1.errors.txt0
-rw-r--r--tests/auto/cplusplus/cxx11/tst_cxx11.cpp1
6 files changed, 34 insertions, 2 deletions
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index 3547041212..81d90e7dfb 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -863,7 +863,8 @@ bool Parser::parseStaticAssertDeclaration(DeclarationAST *&node)
bool Parser::parseNamespace(DeclarationAST *&node)
{
DEBUG_THIS_RULE();
- if (LA() != T_NAMESPACE && !(_languageFeatures.cxx11Enabled && LA() == T_INLINE && LA(2) == T_NAMESPACE))
+ if (LA() != T_NAMESPACE && !(_languageFeatures.cxx11Enabled && LA() == T_INLINE && LA(2) == T_NAMESPACE)
+ && !isNestedNamespace())
return false;
unsigned inline_token = 0;
@@ -892,7 +893,9 @@ bool Parser::parseNamespace(DeclarationAST *&node)
if (LA() == T_IDENTIFIER)
ast->identifier_token = consumeToken();
parseOptionalAttributeSpecifierSequence(ast->attribute_list);
- if (LA() == T_LBRACE) {
+ if (isNestedNamespace()) {
+ parseNestedNamespace(ast->linkage_body);
+ } else if (LA() == T_LBRACE) {
parseLinkageBody(ast->linkage_body);
} else { // attempt to do error recovery
unsigned pos = cursor();
@@ -923,6 +926,22 @@ bool Parser::parseNamespace(DeclarationAST *&node)
return true;
}
+bool Parser::isNestedNamespace() const
+{
+ return _languageFeatures.cxx11Enabled && LA() == T_COLON_COLON && LA(2) == T_IDENTIFIER;
+}
+
+bool Parser::parseNestedNamespace(DeclarationAST *&node)
+{
+ DEBUG_THIS_RULE();
+ DeclarationAST *ast = 0;
+ if (isNestedNamespace() && parseNamespace(ast)) {
+ node = ast;
+ return true;
+ }
+ return false;
+}
+
bool Parser::parseUsing(DeclarationAST *&node)
{
DEBUG_THIS_RULE();
diff --git a/src/libs/3rdparty/cplusplus/Parser.h b/src/libs/3rdparty/cplusplus/Parser.h
index 004d533109..110bb29d2b 100644
--- a/src/libs/3rdparty/cplusplus/Parser.h
+++ b/src/libs/3rdparty/cplusplus/Parser.h
@@ -119,6 +119,7 @@ public:
bool parseNestedNameSpecifierOpt(NestedNameSpecifierListAST *&name, bool acceptTemplateId);
bool parseStaticAssertDeclaration(DeclarationAST *&node);
bool parseNamespace(DeclarationAST *&node);
+ bool parseNestedNamespace(DeclarationAST *&node);
bool parseNamespaceAliasDefinition(DeclarationAST *&node);
bool parseNewArrayDeclarator(NewArrayDeclaratorListAST *&node);
bool parseNewExpression(ExpressionAST *&node);
@@ -332,6 +333,8 @@ private:
private:
Parser(const Parser& source);
void operator =(const Parser& source);
+
+ bool isNestedNamespace() const;
};
} // namespace CPlusPlus
diff --git a/tests/auto/cplusplus/cxx11/cxx11.pro b/tests/auto/cplusplus/cxx11/cxx11.pro
index f1b414bc78..51ed3028f0 100644
--- a/tests/auto/cplusplus/cxx11/cxx11.pro
+++ b/tests/auto/cplusplus/cxx11/cxx11.pro
@@ -7,6 +7,8 @@ SOURCES += tst_cxx11.cpp
DISTFILES += \
data/inlineNamespace.1.cpp \
data/inlineNamespace.1.errors.txt \
+ data/nestedNamespace.1.cpp \
+ data/nestedNamespace.1.errors.txt \
data/staticAssert.1.cpp \
data/staticAssert.1.errors.txt \
data/noExcept.1.cpp \
diff --git a/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.cpp b/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.cpp
new file mode 100644
index 0000000000..92a42a33ad
--- /dev/null
+++ b/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.cpp
@@ -0,0 +1,7 @@
+
+namespace A::B::C {
+ class Foo {
+
+ };
+}
+
diff --git a/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.errors.txt b/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.errors.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.errors.txt
diff --git a/tests/auto/cplusplus/cxx11/tst_cxx11.cpp b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp
index a39f367473..108d93f18f 100644
--- a/tests/auto/cplusplus/cxx11/tst_cxx11.cpp
+++ b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp
@@ -176,6 +176,7 @@ void tst_cxx11::parse_data()
QTest::addColumn<QString>("errorFile");
QTest::newRow("inlineNamespace.1") << "inlineNamespace.1.cpp" << "inlineNamespace.1.errors.txt";
+ QTest::newRow("nestedNamespace.1") << "nestedNamespace.1.cpp" << "nestedNamespace.1.errors.txt";
QTest::newRow("staticAssert.1") << "staticAssert.1.cpp" << "staticAssert.1.errors.txt";
QTest::newRow("noExcept.1") << "noExcept.1.cpp" << "noExcept.1.errors.txt";
QTest::newRow("braceInitializers.1") << "braceInitializers.1.cpp" << "braceInitializers.1.errors.txt";