diff options
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 5 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 13 | ||||
-rw-r--r-- | tests/auto/cplusplus/cxx11/data/defaultdeleteInitializer.1.cpp | 8 | ||||
-rw-r--r-- | tests/auto/cplusplus/cxx11/tst_cxx11.cpp | 9 |
4 files changed, 31 insertions, 4 deletions
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index 59b2a2b3fd..c66c3cad2d 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -1901,7 +1901,10 @@ bool Bind::visit(SimpleDeclarationAST *ast) if (Function *funTy = decl->type()->asFunctionType()) { funTy->setMethodKey(methodKey); - if (funTy->isVirtual() && it->value->equal_token) + bool pureVirtualInit = it->value->equal_token + && it->value->initializer + && it->value->initializer->asNumericLiteral(); + if (funTy->isVirtual() && pureVirtualInit) funTy->setPureVirtual(true); } } diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 150b8c055f..5756b9d420 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -2510,6 +2510,19 @@ bool Parser::parseInitDeclarator(DeclaratorAST *&node, SpecifierListAST *decl_sp return true; } rewind(colon_token); + } else if (isFunctionDeclarator && declaringClass && node->core_declarator && LA() == T_EQUAL && LA(3) == T_SEMICOLON) { // = 0, = delete, = default + if (!_cxx0xEnabled || LA(2) == T_NUMERIC_LITERAL) { + parseInitializer(node->initializer, &node->equal_token); + } else { + node->equal_token = consumeToken(); + + IdExpressionAST *id_expr = new (_pool) IdExpressionAST; + node->initializer = id_expr; + + SimpleNameAST *simple_name = new (_pool) SimpleNameAST; + id_expr->name = simple_name; + simple_name->identifier_token = consumeToken(); + } } else if (node->core_declarator && (LA() == T_EQUAL || (_cxx0xEnabled && !isFunctionDeclarator && LA() == T_LBRACE) || (! declaringClass && LA() == T_LPAREN))) { parseInitializer(node->initializer, &node->equal_token); } diff --git a/tests/auto/cplusplus/cxx11/data/defaultdeleteInitializer.1.cpp b/tests/auto/cplusplus/cxx11/data/defaultdeleteInitializer.1.cpp new file mode 100644 index 0000000000..7ec9e9b91e --- /dev/null +++ b/tests/auto/cplusplus/cxx11/data/defaultdeleteInitializer.1.cpp @@ -0,0 +1,8 @@ +class C { + C() = default; + C(const C &) = delete; + C &operator=(const C &) = default; + + void foo() = delete; + template <class T> void bar(T) = delete; +}; diff --git a/tests/auto/cplusplus/cxx11/tst_cxx11.cpp b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp index 23ecf2a563..63bb5fa3d2 100644 --- a/tests/auto/cplusplus/cxx11/tst_cxx11.cpp +++ b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp @@ -40,10 +40,12 @@ using namespace CPlusPlus; #define VERIFY_ERRORS() \ do { \ - QFile e(testdata(errorFile)); \ QByteArray expectedErrors; \ - if (e.open(QFile::ReadOnly)) \ - expectedErrors = QTextStream(&e).readAll().toUtf8(); \ + if (!errorFile.isEmpty()) { \ + QFile e(testdata(errorFile)); \ + if (e.open(QFile::ReadOnly)) \ + expectedErrors = QTextStream(&e).readAll().toUtf8(); \ + } \ QCOMPARE(QString::fromLatin1(errors), QString::fromLatin1(expectedErrors)); \ } while (0) @@ -135,6 +137,7 @@ void tst_cxx11::parse_data() 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"; + QTest::newRow("defaultdeleteInitializer.1") << "defaultdeleteInitializer.1.cpp" << ""; } void tst_cxx11::parse() |