fix out of line member functions using global namespace (#3063)

This commit is contained in:
IOBYTE 2021-01-19 12:52:47 -05:00 committed by GitHub
parent 6012cd4fd9
commit 952857195b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 1 deletions

View File

@ -2724,7 +2724,7 @@ void SymbolDatabase::addClassFunction(Scope **scope, const Token **tok, const To
// back up to head of path // back up to head of path
while (tok1 && tok1->previous() && tok1->previous()->str() == "::" && tok1->tokAt(-2) && while (tok1 && tok1->previous() && tok1->previous()->str() == "::" && tok1->tokAt(-2) &&
(tok1->tokAt(-2)->isName() || ((tok1->tokAt(-2)->isName() && !tok1->tokAt(-2)->isStandardType()) ||
(tok1->strAt(-2) == ">" && tok1->linkAt(-2) && Token::Match(tok1->linkAt(-2)->previous(), "%name%")))) { (tok1->strAt(-2) == ">" && tok1->linkAt(-2) && Token::Match(tok1->linkAt(-2)->previous(), "%name%")))) {
count++; count++;
const Token * tok2 = tok1->tokAt(-2); const Token * tok2 = tok1->tokAt(-2);
@ -2745,6 +2745,12 @@ void SymbolDatabase::addClassFunction(Scope **scope, const Token **tok, const To
if (!tok1) if (!tok1)
return; return;
// add global namespace if present
if (tok1->strAt(-1) == "::") {
path_length++;
path.insert(0, ":: ");
}
std::list<Scope>::iterator it1; std::list<Scope>::iterator it1;
// search for match // search for match

View File

@ -399,6 +399,7 @@ private:
TEST_CASE(findFunction32); // C: relax type matching TEST_CASE(findFunction32); // C: relax type matching
TEST_CASE(findFunction33); // #9885 variadic function TEST_CASE(findFunction33); // #9885 variadic function
TEST_CASE(findFunction34); // #10061 TEST_CASE(findFunction34); // #10061
TEST_CASE(findFunction35);
TEST_CASE(findFunctionContainer); TEST_CASE(findFunctionContainer);
TEST_CASE(findFunctionExternC); TEST_CASE(findFunctionExternC);
TEST_CASE(findFunctionGlobalScope); // ::foo TEST_CASE(findFunctionGlobalScope); // ::foo
@ -6238,6 +6239,29 @@ private:
ASSERT_EQUALS(8, foo->function()->tokenDef->linenr()); ASSERT_EQUALS(8, foo->function()->tokenDef->linenr());
} }
void findFunction35() {
GET_SYMBOL_DB("namespace clangimport {\n"
" class AstNode {\n"
" public:\n"
" AstNode();\n"
" void createTokens();\n"
" };\n"
"}\n"
"::clangimport::AstNode::AstNode() { }\n"
"void ::clangimport::AstNode::createTokens() { }");
(void)db;
const Token *foo = Token::findsimplematch(tokenizer.tokens(), "AstNode ( ) { }");
ASSERT(foo);
ASSERT(foo->function());
ASSERT(foo->function()->tokenDef);
ASSERT_EQUALS(4, foo->function()->tokenDef->linenr());
foo = Token::findsimplematch(tokenizer.tokens(), "createTokens ( ) { }");
ASSERT(foo);
ASSERT(foo->function());
ASSERT(foo->function()->tokenDef);
ASSERT_EQUALS(5, foo->function()->tokenDef->linenr());
}
void findFunctionContainer() { void findFunctionContainer() {
{ {
GET_SYMBOL_DB("void dostuff(std::vector<int> v);\n" GET_SYMBOL_DB("void dostuff(std::vector<int> v);\n"