diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 99cede92bfe..128e7f5e9d6 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1486,13 +1486,13 @@ void SymbolDatabase::createSymbolDatabaseIncompleteVars() tok = tok->linkAt(1); continue; } - if (!tok->isNameOnly()) + if (!(tok->isNameOnly() || tok->isKeyword())) continue; if (tok->type()) continue; if (Token::Match(tok->next(), "::|.|(|{|:|%var%")) continue; - if (Token::Match(tok->next(), "&|&&|* )|,|%var%")) + if (Token::Match(tok->next(), "&|&&|* )|,|%var%|const")) continue; // Very likely a typelist if (Token::Match(tok->tokAt(-2), "%type% ,") || Token::Match(tok->next(), ", %type%")) @@ -1502,6 +1502,8 @@ void SymbolDatabase::createSymbolDatabaseIncompleteVars() tok = tok->linkAt(1); continue; } + if (tok->isKeyword()) + continue; // Skip goto labels if (Token::simpleMatch(tok->previous(), "goto")) continue; diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 8fab8b21fac..e7d2e45e2ce 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -5479,6 +5479,20 @@ class TestSymbolDatabase : public TestFixture { const Token* free3 = Token::findsimplematch(free2->next(), "free"); ASSERT(free3 && free3->isIncompleteVar()); } + { + GET_SYMBOL_DB("void f(QObject* p, const char* s) {\n" + " QWidget* w = dynamic_cast(p);\n" + " g(static_cast(s));\n" + " const std::uint64_t* const data = nullptr;\n" + "}\n"); + ASSERT(db && errout.str().empty()); + const Token* qw = Token::findsimplematch(tokenizer.tokens(), "QWidget * >"); + ASSERT(qw && !qw->isIncompleteVar()); + const Token* s = Token::findsimplematch(qw, "string >"); + ASSERT(s && !s->isIncompleteVar()); + const Token* u = Token::findsimplematch(s, "uint64_t"); + ASSERT(u && !u->isIncompleteVar()); + } } void enum1() {