diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 8bb492fa3..501044f1b 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1008,6 +1008,10 @@ void SymbolDatabase::addFunction(Scope **scope, const Token **tok, const Token * else tok1 = (*tok)->tokAt(-2); + // syntax error? + if (!tok1) + return; + // back up to head of path while (tok1 && tok1->previous() && tok1->previous()->str() == "::") { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 0c81cc14f..69d970c88 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -121,6 +121,7 @@ private: TEST_CASE(symboldatabase16); // ticket #2637 TEST_CASE(symboldatabase17); // ticket #2657 TEST_CASE(symboldatabase18); // ticket #2865 + TEST_CASE(symboldatabase19); // ticket #2991 (segmentation fault) } void test_isVariableDeclarationCanHandleNull() @@ -878,6 +879,14 @@ private: ASSERT_EQUALS("", errout.str()); } + void symboldatabase19() + { + // ticket #2991 - segmentation fault + check("::y(){x}\n"); + + ASSERT_EQUALS("", errout.str()); + } + }; REGISTER_TEST(TestSymbolDatabase)