Fixed #7272 (Tokenizer:setVarId: handle namespaces better)
This commit is contained in:
parent
516f043a43
commit
a434e0fb1a
|
@ -2679,8 +2679,11 @@ void Tokenizer::setVarId()
|
||||||
// parse anonymous unions/structs as part of the current scope
|
// parse anonymous unions/structs as part of the current scope
|
||||||
if (!(Token::simpleMatch(tok, "} ;") && tok->link() && Token::Match(tok->link()->previous(), "union|struct {")) &&
|
if (!(Token::simpleMatch(tok, "} ;") && tok->link() && Token::Match(tok->link()->previous(), "union|struct {")) &&
|
||||||
!(initlist && Token::Match(tok, "} ,|{") && Token::Match(tok->link()->previous(), "%name%|>|>> {"))) {
|
!(initlist && Token::Match(tok, "} ,|{") && Token::Match(tok->link()->previous(), "%name%|>|>> {"))) {
|
||||||
|
bool isNamespace = false;
|
||||||
|
for (const Token *tok1 = tok->link()->previous(); tok1 && tok1->isName(); tok1 = tok1->previous())
|
||||||
|
isNamespace |= (tok1->str() == "namespace");
|
||||||
// Set variable ids in class declaration..
|
// Set variable ids in class declaration..
|
||||||
if (!initlist && !isC() && !scopeStack.top().isExecutable && tok->link()) {
|
if (!initlist && !isC() && !scopeStack.top().isExecutable && tok->link() && !isNamespace) {
|
||||||
setVarIdClassDeclaration(tok->link(),
|
setVarIdClassDeclaration(tok->link(),
|
||||||
variableId,
|
variableId,
|
||||||
scopeStack.top().startVarid,
|
scopeStack.top().startVarid,
|
||||||
|
|
|
@ -122,6 +122,7 @@ private:
|
||||||
TEST_CASE(varid_in_class18); // #7127
|
TEST_CASE(varid_in_class18); // #7127
|
||||||
TEST_CASE(varid_in_class19);
|
TEST_CASE(varid_in_class19);
|
||||||
TEST_CASE(varid_in_class20); // #7267
|
TEST_CASE(varid_in_class20); // #7267
|
||||||
|
TEST_CASE(varid_namespace); // #7272
|
||||||
TEST_CASE(varid_initList);
|
TEST_CASE(varid_initList);
|
||||||
TEST_CASE(varid_initListWithBaseTemplate);
|
TEST_CASE(varid_initListWithBaseTemplate);
|
||||||
TEST_CASE(varid_initListWithScope);
|
TEST_CASE(varid_initListWithScope);
|
||||||
|
@ -1827,6 +1828,24 @@ private:
|
||||||
"8: template < class C > cacheEntry < C > :: cacheEntry ( ) : m_key@1 ( ) { }\n", tokenize(code, false, "test.cpp"));
|
"8: template < class C > cacheEntry < C > :: cacheEntry ( ) : m_key@1 ( ) { }\n", tokenize(code, false, "test.cpp"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void varid_namespace() { // #7272
|
||||||
|
const char code[] = "namespace Blah {\n"
|
||||||
|
" struct foo { int x;};\n"
|
||||||
|
" struct bar {\n"
|
||||||
|
" int x;\n"
|
||||||
|
" union { char y; };\n"
|
||||||
|
" };\n"
|
||||||
|
"}";
|
||||||
|
ASSERT_EQUALS("\n\n##file 0\n"
|
||||||
|
"1: namespace Blah {\n"
|
||||||
|
"2: struct foo { int x@1 ; } ;\n"
|
||||||
|
"3: struct bar {\n"
|
||||||
|
"4: int x@2 ;\n"
|
||||||
|
"5: union { char y@3 ; } ;\n"
|
||||||
|
"6: } ;\n"
|
||||||
|
"7: }\n", tokenize(code, false, "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