Tokenizer; Fixed varid for base class member variable
This commit is contained in:
parent
7a4462dac5
commit
245284acde
|
@ -3830,7 +3830,22 @@ void Tokenizer::setVarIdPass2()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (Token::Match(tokStart, "%name% ,|{")) {
|
if (Token::Match(tokStart, "%name% ,|{")) {
|
||||||
const std::map<std::string, int>& baseClassVars = varsByClass[tokStart->str()];
|
std::string baseClassName = tokStart->str();
|
||||||
|
std::string scopeName3(scopeName2);
|
||||||
|
while (!scopeName3.empty()) {
|
||||||
|
const std::string name = scopeName3 + baseClassName;
|
||||||
|
if (varsByClass.find(name) != varsByClass.end()) {
|
||||||
|
baseClassName = name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (scopeName3.size() < 8)
|
||||||
|
break;
|
||||||
|
const std::string::size_type pos = scopeName3.rfind(" :: ", scopeName.size()-5);
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
break;
|
||||||
|
scopeName3.erase(pos + 4);
|
||||||
|
}
|
||||||
|
const std::map<std::string, int>& baseClassVars = varsByClass[baseClassName];
|
||||||
thisClassVars.insert(baseClassVars.begin(), baseClassVars.end());
|
thisClassVars.insert(baseClassVars.begin(), baseClassVars.end());
|
||||||
}
|
}
|
||||||
tokStart = tokStart->next();
|
tokStart = tokStart->next();
|
||||||
|
|
|
@ -135,6 +135,8 @@ private:
|
||||||
TEST_CASE(varid_namespace_1); // #7272
|
TEST_CASE(varid_namespace_1); // #7272
|
||||||
TEST_CASE(varid_namespace_2); // #7000
|
TEST_CASE(varid_namespace_2); // #7000
|
||||||
TEST_CASE(varid_namespace_3); // #8627
|
TEST_CASE(varid_namespace_3); // #8627
|
||||||
|
TEST_CASE(varid_namespace_4);
|
||||||
|
TEST_CASE(varid_namespace_5);
|
||||||
TEST_CASE(varid_initList);
|
TEST_CASE(varid_initList);
|
||||||
TEST_CASE(varid_initListWithBaseTemplate);
|
TEST_CASE(varid_initListWithBaseTemplate);
|
||||||
TEST_CASE(varid_initListWithScope);
|
TEST_CASE(varid_initListWithScope);
|
||||||
|
@ -1970,6 +1972,44 @@ private:
|
||||||
ASSERT_EQUALS("11: type@2 = 0 ;", getLine(actual,11));
|
ASSERT_EQUALS("11: type@2 = 0 ;", getLine(actual,11));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void varid_namespace_4() {
|
||||||
|
const char code[] = "namespace X {\n"
|
||||||
|
" struct foo { int x;};\n"
|
||||||
|
" struct bar: public foo {\n"
|
||||||
|
" void dostuff();\n"
|
||||||
|
" };\n"
|
||||||
|
" void bar::dostuff() { int x2 = x * 2; }\n"
|
||||||
|
"}";
|
||||||
|
ASSERT_EQUALS("1: namespace X {\n"
|
||||||
|
"2: struct foo { int x@1 ; } ;\n"
|
||||||
|
"3: struct bar : public foo {\n"
|
||||||
|
"4: void dostuff ( ) ;\n"
|
||||||
|
"5: } ;\n"
|
||||||
|
"6: void bar :: dostuff ( ) { int x2@2 ; x2@2 = x@1 * 2 ; }\n"
|
||||||
|
"7: }\n", tokenize(code, "test.cpp"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void varid_namespace_5() {
|
||||||
|
const char code[] = "namespace X {\n"
|
||||||
|
" struct foo { int x;};\n"
|
||||||
|
" namespace Y {\n"
|
||||||
|
" struct bar: public foo {\n"
|
||||||
|
" void dostuff();\n"
|
||||||
|
" };\n"
|
||||||
|
" void bar::dostuff() { int x2 = x * 2; }\n"
|
||||||
|
" }\n"
|
||||||
|
"}";
|
||||||
|
ASSERT_EQUALS("1: namespace X {\n"
|
||||||
|
"2: struct foo { int x@1 ; } ;\n"
|
||||||
|
"3: namespace Y {\n"
|
||||||
|
"4: struct bar : public foo {\n"
|
||||||
|
"5: void dostuff ( ) ;\n"
|
||||||
|
"6: } ;\n"
|
||||||
|
"7: void bar :: dostuff ( ) { int x2@2 ; x2@2 = x@1 * 2 ; }\n"
|
||||||
|
"8: }\n"
|
||||||
|
"9: }\n", tokenize(code, "test.cpp"));
|
||||||
|
}
|
||||||
|
|
||||||
void varid_initList() {
|
void varid_initList() {
|
||||||
const char code1[] = "class A {\n"
|
const char code1[] = "class A {\n"
|
||||||
" A() : x(0) {}\n"
|
" A() : x(0) {}\n"
|
||||||
|
|
Loading…
Reference in New Issue