This commit is contained in:
parent
2aca275e0c
commit
3b07661fd3
@ -4389,7 +4389,7 @@ void Tokenizer::setVarIdPass2()
|
|||||||
|
|
||||||
std::map<std::string, nonneg int> &thisClassVars = varsByClass[scopeName2 + classname];
|
std::map<std::string, nonneg int> &thisClassVars = varsByClass[scopeName2 + classname];
|
||||||
while (Token::Match(tokStart, ":|::|,|%name%")) {
|
while (Token::Match(tokStart, ":|::|,|%name%")) {
|
||||||
if (Token::Match(tokStart, "%name% <")) {
|
if (Token::Match(tokStart, "%name% <")) { // TODO: why skip templates?
|
||||||
tokStart = tokStart->next()->findClosingBracket();
|
tokStart = tokStart->next()->findClosingBracket();
|
||||||
if (tokStart)
|
if (tokStart)
|
||||||
tokStart = tokStart->next();
|
tokStart = tokStart->next();
|
||||||
@ -4397,6 +4397,11 @@ void Tokenizer::setVarIdPass2()
|
|||||||
}
|
}
|
||||||
if (Token::Match(tokStart, "%name% ,|{")) {
|
if (Token::Match(tokStart, "%name% ,|{")) {
|
||||||
std::string baseClassName = tokStart->str();
|
std::string baseClassName = tokStart->str();
|
||||||
|
const Token* baseStart = tokStart;
|
||||||
|
while (Token::Match(baseStart->tokAt(-2), "%name% ::")) { // build base class name
|
||||||
|
baseClassName.insert(0, baseStart->strAt(-2) + " :: ");
|
||||||
|
baseStart = baseStart->tokAt(-2);
|
||||||
|
}
|
||||||
std::string scopeName3(scopeName2);
|
std::string scopeName3(scopeName2);
|
||||||
while (!scopeName3.empty()) {
|
while (!scopeName3.empty()) {
|
||||||
const std::string name = scopeName3 + baseClassName;
|
const std::string name = scopeName3 + baseClassName;
|
||||||
|
@ -135,6 +135,7 @@ private:
|
|||||||
TEST_CASE(varid_in_class20); // #7267
|
TEST_CASE(varid_in_class20); // #7267
|
||||||
TEST_CASE(varid_in_class21); // #7788
|
TEST_CASE(varid_in_class21); // #7788
|
||||||
TEST_CASE(varid_in_class22); // #10872
|
TEST_CASE(varid_in_class22); // #10872
|
||||||
|
TEST_CASE(varid_in_class23); // #11293
|
||||||
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
|
||||||
@ -1964,6 +1965,28 @@ private:
|
|||||||
ASSERT_EQUALS(expected, tokenize(code, "test.cpp"));
|
ASSERT_EQUALS(expected, tokenize(code, "test.cpp"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void varid_in_class23() { // #11293
|
||||||
|
const char code[] = "struct A {\n"
|
||||||
|
" struct S {\n"
|
||||||
|
" bool b;\n"
|
||||||
|
" };\n"
|
||||||
|
"};\n"
|
||||||
|
"struct B : A::S {\n"
|
||||||
|
" void f() { b = false; }\n"
|
||||||
|
"};\n";
|
||||||
|
|
||||||
|
const char expected[] = "1: struct A {\n"
|
||||||
|
"2: struct S {\n"
|
||||||
|
"3: bool b@1 ;\n"
|
||||||
|
"4: } ;\n"
|
||||||
|
"5: } ;\n"
|
||||||
|
"6: struct B : A :: S {\n"
|
||||||
|
"7: void f ( ) { b@1 = false ; }\n"
|
||||||
|
"8: } ;\n";
|
||||||
|
|
||||||
|
ASSERT_EQUALS(expected, tokenize(code, "test.cpp"));
|
||||||
|
}
|
||||||
|
|
||||||
void varid_namespace_1() { // #7272
|
void varid_namespace_1() { // #7272
|
||||||
const char code[] = "namespace Blah {\n"
|
const char code[] = "namespace Blah {\n"
|
||||||
" struct foo { int x;};\n"
|
" struct foo { int x;};\n"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user