From b44f448accd27dc46d83268910ecbd2503238384 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Tue, 2 Aug 2016 18:54:01 +0200 Subject: [PATCH] Fixed #7649 (SymbolDatabase: Wrong overloaded function is picked for char and wchar_t) --- lib/symboldatabase.cpp | 3 ++- test/testsymboldatabase.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 853ee1ab0..308ab73d4 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3697,7 +3697,8 @@ const Function* Scope::findFunction(const Token *tok, bool requireConst) const // check for a match with a string literal else if (Token::Match(arguments[j], "%str% ,|)") && funcarg->typeStartToken() != funcarg->typeEndToken() && - Token::Match(funcarg->typeStartToken(), "char|wchar_t *")) { + ((!arguments[j]->isLong() && Token::simpleMatch(funcarg->typeStartToken(), "char *")) || + (arguments[j]->isLong() && Token::simpleMatch(funcarg->typeStartToken(), "wchar_t *")))) { same++; } diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 915b90c64..431e6da85 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -296,6 +296,7 @@ private: TEST_CASE(valuetype); TEST_CASE(variadic); // # 7453 + TEST_CASE(variadic2); } void array() { @@ -3727,6 +3728,37 @@ private: ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 1); } } + + void variadic2() { + { + GET_SYMBOL_DB("CBase* create(const char *c1, ...);\n" + "CBase* create(const wchar_t *c1, ...);\n" + "int foo(COther & ot)\n" + "{\n" + " CBase* cp1 = create(\"AAAA\", 44, (char*)0);\n" + " CBase* cp2 = create(L\"AAAA\", 44, (char*)0);\n" + "}"); + + const Token *f = Token::findsimplematch(tokenizer.tokens(), "cp1 = create ("); + ASSERT_EQUALS(true, db && f && f->tokAt(2) && f->tokAt(2)->function() && f->tokAt(2)->function()->tokenDef->linenr() == 1); + f = Token::findsimplematch(tokenizer.tokens(), "cp2 = create ("); + ASSERT_EQUALS(true, db && f && f->tokAt(2) && f->tokAt(2)->function() && f->tokAt(2)->function()->tokenDef->linenr() == 2); + } + { + GET_SYMBOL_DB("CBase* create(const wchar_t *c1, ...);\n" + "CBase* create(const char *c1, ...);\n" + "int foo(COther & ot)\n" + "{\n" + " CBase* cp1 = create(\"AAAA\", 44, (char*)0);\n" + " CBase* cp2 = create(L\"AAAA\", 44, (char*)0);\n" + "}"); + + const Token *f = Token::findsimplematch(tokenizer.tokens(), "cp1 = create ("); + ASSERT_EQUALS(true, db && f && f->tokAt(2) && f->tokAt(2)->function() && f->tokAt(2)->function()->tokenDef->linenr() == 2); + f = Token::findsimplematch(tokenizer.tokens(), "cp2 = create ("); + ASSERT_EQUALS(true, db && f && f->tokAt(2) && f->tokAt(2)->function() && f->tokAt(2)->function()->tokenDef->linenr() == 1); + } + } }; REGISTER_TEST(TestSymbolDatabase)