diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index b2e2c52d4..51f971907 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -192,7 +192,7 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti } // using namespace - else if (Token::Match(tok, "using namespace %type% ;|::")) { + else if (Token::Match(tok, "using namespace ::| %type% ;|::")) { Scope::UsingInfo using_info; using_info.start = tok; // save location @@ -200,7 +200,15 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti scope->usingList.push_back(using_info); - tok = tok->tokAt(3); + // check for global namespace + if (tok->strAt(2) == "::") + tok = tok->tokAt(4); + else + tok = tok->tokAt(3); + + // skip over qualification + while (tok && Token::Match(tok, "%type% ::")) + tok = tok->tokAt(2); } // unnamed struct and union diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index abea3a6a3..012e34ed5 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -149,6 +149,7 @@ private: TEST_CASE(localvarNULL); // #4203 - Setting NULL value is not redundant - it is safe TEST_CASE(crash1); + TEST_CASE(usingNamespace); // #4585 } void checkStructMemberUsage(const char code[]) { @@ -3570,6 +3571,22 @@ private: "}\n" "SAL_WNODEPRECATED_DECLARATIONS_POP"); // #4033 } + + void usingNamespace() { + functionVariableUsage("int foo() {\n" + " using namespace ::com::sun::star::i18n;\n" + " bool b = false;\n" + " int j = 0;\n" + " for (int i = 0; i < 3; i++) {\n" + " if (!b) {\n" + " j = 3;\n" + " b = true;\n" + " }\n" + " }\n" + " return j;\n" + "}\n"); // #4585 + ASSERT_EQUALS("", errout.str()); + } }; REGISTER_TEST(TestUnusedVar)