Skip to content

Commit b67cf0a

Browse files
committed
Improved handling of varid in complex scopes
1 parent ced3f4c commit b67cf0a

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

lib/tokenize.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2880,17 +2880,17 @@ static std::string getScopeName(const std::list<ScopeInfo2> &scopeInfo)
28802880
return ret;
28812881
}
28822882

2883-
static Token * matchFunctionName(const Member &func, const std::list<ScopeInfo2> &scopeInfo)
2883+
static Token * matchMemberName(const Member &member, const std::list<ScopeInfo2> &scopeInfo)
28842884
{
28852885
if (scopeInfo.empty())
28862886
return nullptr;
2887-
std::list<std::string>::const_iterator funcScopeIt = func.scope.begin();
2888-
Token *tok2 = func.tok;
2887+
std::list<std::string>::const_iterator memberScopeIt = member.scope.begin();
2888+
Token *tok2 = member.tok;
28892889
for (std::list<ScopeInfo2>::const_iterator it = scopeInfo.begin(); tok2 && it != scopeInfo.end(); ++it) {
2890-
if (funcScopeIt != func.scope.end()) {
2891-
if (it->name != *funcScopeIt)
2890+
if (memberScopeIt != member.scope.end()) {
2891+
if (it->name != *memberScopeIt)
28922892
return nullptr;
2893-
++funcScopeIt;
2893+
++memberScopeIt;
28942894
continue;
28952895
}
28962896

@@ -2905,7 +2905,19 @@ static Token * matchFunctionName(const Member &func, const std::list<ScopeInfo2>
29052905
}
29062906
tok2 = tok2->tokAt(2);
29072907
}
2908-
return (funcScopeIt == func.scope.end() && Token::Match(tok2, "~| %name% (")) ? tok2 : nullptr;
2908+
return (memberScopeIt == member.scope.end() && Token::Match(tok2, "~| %name%")) ? tok2 : nullptr;
2909+
}
2910+
2911+
static Token * matchMemberVarName(const Member &var, const std::list<ScopeInfo2> &scopeInfo)
2912+
{
2913+
Token *tok = matchMemberName(var, scopeInfo);
2914+
return Token::Match(tok, "%name% !!(") ? tok : nullptr;
2915+
}
2916+
2917+
static Token * matchMemberFunctionName(const Member &func, const std::list<ScopeInfo2> &scopeInfo)
2918+
{
2919+
Token *tok = matchMemberName(func, scopeInfo);
2920+
return Token::Match(tok, "~| %name% (") ? tok : nullptr;
29092921
}
29102922

29112923
void Tokenizer::setVarIdPass2()
@@ -3024,12 +3036,10 @@ void Tokenizer::setVarIdPass2()
30243036
continue;
30253037

30263038
// Member variables
3027-
for (std::list<Member>::iterator func = allMemberVars.begin(); func != allMemberVars.end(); ++func) {
3028-
if (!Token::simpleMatch(func->tok, classname.c_str()))
3039+
for (std::list<Member>::iterator var = allMemberVars.begin(); var != allMemberVars.end(); ++var) {
3040+
Token *tok2 = matchMemberVarName(*var, scopeInfo);
3041+
if (!tok2)
30293042
continue;
3030-
3031-
Token *tok2 = func->tok;
3032-
tok2 = tok2->tokAt(2);
30333043
tok2->varId(thisClassVars[tok2->str()]);
30343044
}
30353045

@@ -3038,7 +3048,7 @@ void Tokenizer::setVarIdPass2()
30383048

30393049
// Set variable ids in member functions for this class..
30403050
for (std::list<Member>::const_iterator func = allMemberFunctions.begin(); func != allMemberFunctions.end(); ++func) {
3041-
Token *tok2 = matchFunctionName(*func, scopeInfo);
3051+
Token *tok2 = matchMemberFunctionName(*func, scopeInfo);
30423052
if (!tok2)
30433053
continue;
30443054

test/testvarid.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ class TestVarID : public TestFixture {
179179
TEST_CASE(varid_classnameshaddowsvariablename); // #3990
180180

181181
TEST_CASE(varidnamespace1);
182+
TEST_CASE(varidnamespace2);
182183
}
183184

184185
std::string tokenize(const char code[], bool simplify = false, const char filename[] = "test.cpp") {
@@ -2826,6 +2827,28 @@ class TestVarID : public TestFixture {
28262827

28272828
ASSERT_EQUALS(expected, tokenize(code));
28282829
}
2830+
2831+
void varidnamespace2() {
2832+
const char code[] = "namespace A {\n"
2833+
" namespace B {\n"
2834+
" char buf[20];\n"
2835+
" }\n"
2836+
"}\n"
2837+
"int main() {\n"
2838+
" return foo(A::B::buf);\n"
2839+
"}";
2840+
2841+
const char expected[] = "1: namespace A {\n"
2842+
"2: namespace B {\n"
2843+
"3: char buf@1 [ 20 ] ;\n"
2844+
"4: }\n"
2845+
"5: }\n"
2846+
"6: int main ( ) {\n"
2847+
"7: return foo ( A :: B :: buf@1 ) ;\n"
2848+
"8: }\n";
2849+
2850+
ASSERT_EQUALS(expected, tokenize(code));
2851+
}
28292852
};
28302853

28312854
REGISTER_TEST(TestVarID)

0 commit comments

Comments
 (0)