From 6b4a3bc830ea704c7a01e556c51c2b5892a2dda8 Mon Sep 17 00:00:00 2001 From: IOBYTE Date: Sat, 26 Oct 2019 11:39:46 -0400 Subject: [PATCH] fix #9431 (Invalid syntax error on valid C++ code) (#2298) --- lib/symboldatabase.cpp | 4 ++-- test/testsymboldatabase.cpp | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 4b5985e3e..3875a44b5 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -2397,7 +2397,7 @@ void SymbolDatabase::addClassFunction(Scope **scope, const Token **tok, const To if (!func->hasBody()) { const Token *closeParen = (*tok)->next()->link(); if (closeParen) { - if (Token::simpleMatch(closeParen, ") = default ;")) { + if (Token::Match(closeParen, ") noexcept| = default ;")) { func->isDefault(true); return; } @@ -2469,7 +2469,7 @@ void SymbolDatabase::addClassFunction(Scope **scope, const Token **tok, const To // normal function? const Token *closeParen = (*tok)->next()->link(); if (closeParen) { - if (Token::simpleMatch(closeParen, ") = default ;")) { + if (Token::Match(closeParen, ") noexcept| = default ;")) { func->isDefault(true); return; } diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index ebaaafe4e..5c92c49fa 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -307,6 +307,7 @@ private: TEST_CASE(symboldatabase80); // #9389 TEST_CASE(symboldatabase81); // #9411 TEST_CASE(symboldatabase82); + TEST_CASE(symboldatabase83); // #9431 TEST_CASE(createSymbolDatabaseFindAllScopes1); @@ -4423,6 +4424,23 @@ private: ASSERT_EQUALS(false, db->functionScopes[0]->function->isConstructor()); } + void symboldatabase83() { // #9431 + const bool old = settings1.debugwarnings; + settings1.debugwarnings = true; + GET_SYMBOL_DB("struct a { a() noexcept; };\n" + "a::a() noexcept = default;"); + settings1.debugwarnings = old; + const Scope *scope = db->findScopeByName("a"); + ASSERT(scope); + ASSERT(scope->functionList.size() == 1); + ASSERT(scope->functionList.front().name() == "a"); + ASSERT(scope->functionList.front().hasBody() == false); + ASSERT(scope->functionList.front().isConstructor() == true); + ASSERT(scope->functionList.front().isDefault() == true); + ASSERT(scope->functionList.front().isNoExcept() == true); + ASSERT_EQUALS("", errout.str()); + } + void createSymbolDatabaseFindAllScopes1() { GET_SYMBOL_DB("void f() { union {int x; char *p;} a={0}; }"); ASSERT(db->scopeList.size() == 3);