Fixed #7192 (False positive: uninitMemberVar when base class is in another namespace)
This commit is contained in:
parent
e038dd9663
commit
7191733981
|
@ -2954,20 +2954,28 @@ void Tokenizer::setVarId()
|
||||||
tok2 = tok2->linkAt(2);
|
tok2 = tok2->linkAt(2);
|
||||||
|
|
||||||
// constructor with initializer list
|
// constructor with initializer list
|
||||||
if (Token::Match(tok2, ") : %name% (|{|<")) {
|
if (Token::Match(tok2, ") : %name%")) {
|
||||||
Token *tok3 = tok2;
|
Token *tok3 = tok2;
|
||||||
do {
|
while (Token::Match(tok3, "[)}] [,:]")) {
|
||||||
Token *vartok = tok3->tokAt(2);
|
tok3 = tok3->tokAt(2);
|
||||||
std::map<std::string, unsigned int>::const_iterator varpos = thisClassVars.find(vartok->str());
|
while (Token::Match(tok3, "%name% :: %name%"))
|
||||||
|
tok3 = tok3->tokAt(2);
|
||||||
|
if (!Token::Match(tok3, "%name% (|{|<"))
|
||||||
|
break;
|
||||||
|
|
||||||
|
// set varid
|
||||||
|
std::map<std::string, unsigned int>::const_iterator varpos = thisClassVars.find(tok3->str());
|
||||||
if (varpos != thisClassVars.end())
|
if (varpos != thisClassVars.end())
|
||||||
vartok->varId(varpos->second);
|
tok3->varId(varpos->second);
|
||||||
if (vartok->strAt(1) == "<") {
|
|
||||||
tok3 = vartok->next()->findClosingBracket();
|
// goto end of var
|
||||||
|
if (tok3->strAt(1) == "<") {
|
||||||
|
tok3 = tok3->next()->findClosingBracket();
|
||||||
if (tok3 && tok3->next() && tok3->next()->link())
|
if (tok3 && tok3->next() && tok3->next()->link())
|
||||||
tok3 = tok3->next()->link();
|
tok3 = tok3->next()->link();
|
||||||
} else
|
} else
|
||||||
tok3 = vartok->linkAt(1);
|
tok3 = tok3->linkAt(1);
|
||||||
} while (Token::Match(tok3, ")|} [:,] %name% (|{|<"));
|
}
|
||||||
if (Token::Match(tok3, ")|} {")) {
|
if (Token::Match(tok3, ")|} {")) {
|
||||||
setVarIdClassFunction(classname, tok2, tok3->next()->link(), thisClassVars, structMembers, &_varId);
|
setVarIdClassFunction(classname, tok2, tok3->next()->link(), thisClassVars, structMembers, &_varId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,6 +123,7 @@ private:
|
||||||
TEST_CASE(varid_in_class19);
|
TEST_CASE(varid_in_class19);
|
||||||
TEST_CASE(varid_initList);
|
TEST_CASE(varid_initList);
|
||||||
TEST_CASE(varid_initListWithBaseTemplate);
|
TEST_CASE(varid_initListWithBaseTemplate);
|
||||||
|
TEST_CASE(varid_initListWithScope);
|
||||||
TEST_CASE(varid_operator);
|
TEST_CASE(varid_operator);
|
||||||
TEST_CASE(varid_throw);
|
TEST_CASE(varid_throw);
|
||||||
TEST_CASE(varid_unknown_macro); // #2638 - unknown macro is not type
|
TEST_CASE(varid_unknown_macro); // #2638 - unknown macro is not type
|
||||||
|
@ -1977,6 +1978,19 @@ private:
|
||||||
tokenize(code5));
|
tokenize(code5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void varid_initListWithScope() {
|
||||||
|
const char code1[] = "class A : public B::C {\n"
|
||||||
|
" A() : B::C(), x(0) {}\n"
|
||||||
|
" int x;\n"
|
||||||
|
"};";
|
||||||
|
ASSERT_EQUALS("\n\n##file 0\n"
|
||||||
|
"1: class A : public B :: C {\n"
|
||||||
|
"2: A ( ) : B :: C ( ) , x@1 ( 0 ) { }\n"
|
||||||
|
"3: int x@1 ;\n"
|
||||||
|
"4: } ;\n",
|
||||||
|
tokenize(code1));
|
||||||
|
}
|
||||||
|
|
||||||
void varid_operator() {
|
void varid_operator() {
|
||||||
{
|
{
|
||||||
const std::string actual = tokenize(
|
const std::string actual = tokenize(
|
||||||
|
|
Loading…
Reference in New Issue