Skip to content

Commit 817eca2

Browse files
Fix #13697 performance regression (hang) in 2.18dev (danmar#7372)
1 parent b81083f commit 817eca2

File tree

2 files changed

+27
-13
lines changed

2 files changed

+27
-13
lines changed

lib/symboldatabase.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5000,7 +5000,7 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess, con
50005000

50015001
if (type == ScopeType::eFor && orig->strAt(-2) == "for") {
50025002
for (const Token* tok2 = tok; tok2 && !Token::Match(tok2, "[;:]"); tok2 = tok2->next()) {
5003-
if (tok2->link()) {
5003+
if (tok2->link() && precedes(tok2, tok2->link())) {
50045004
tok2 = tok2->link();
50055005
continue;
50065006
}

test/testsymboldatabase.cpp

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5982,18 +5982,32 @@ class TestSymbolDatabase : public TestFixture {
59825982
}
59835983

59845984
void createSymbolDatabaseFindAllScopes10() {
5985-
GET_SYMBOL_DB("void g() {\n"
5986-
" for (int i = 0, r = 1; i < r; ++i) {}\n"
5987-
"}\n");
5988-
ASSERT(db);
5989-
ASSERT_EQUALS(3, db->scopeList.size());
5990-
ASSERT_EQUALS(2, db->scopeList.back().varlist.size());
5991-
const Token* const iTok = Token::findsimplematch(tokenizer.tokens(), "i");
5992-
const Token* const rTok = Token::findsimplematch(iTok, "r");
5993-
const Variable* i = iTok->variable(), *r = rTok->variable();
5994-
ASSERT(i != nullptr && r != nullptr);
5995-
ASSERT_EQUALS(i->typeStartToken(), r->typeStartToken());
5996-
ASSERT(i->valueType()->isTypeEqual(r->valueType()));
5985+
{
5986+
GET_SYMBOL_DB("void g() {\n"
5987+
" for (int i = 0, r = 1; i < r; ++i) {}\n"
5988+
"}\n");
5989+
ASSERT(db);
5990+
ASSERT_EQUALS(3, db->scopeList.size());
5991+
ASSERT_EQUALS(2, db->scopeList.back().varlist.size());
5992+
const Token* const iTok = Token::findsimplematch(tokenizer.tokens(), "i");
5993+
const Token* const rTok = Token::findsimplematch(iTok, "r");
5994+
const Variable* i = iTok->variable(), * r = rTok->variable();
5995+
ASSERT(i != nullptr && r != nullptr);
5996+
ASSERT_EQUALS(i->typeStartToken(), r->typeStartToken());
5997+
ASSERT(i->valueType()->isTypeEqual(r->valueType()));
5998+
}
5999+
{
6000+
GET_SYMBOL_DB("void f() {\n" // #13697
6001+
" typedef void (*func_t)();\n"
6002+
" func_t a[] = { nullptr };\n"
6003+
" for (func_t* fp = a; *fp; fp++) {}\n"
6004+
"}\n");
6005+
ASSERT(db); // don't hang
6006+
ASSERT_EQUALS(3, db->scopeList.size());
6007+
ASSERT_EQUALS(1, db->scopeList.back().varlist.size());
6008+
const Token* const fp = Token::findsimplematch(tokenizer.tokens(), "fp");
6009+
ASSERT(fp && fp->variable());
6010+
}
59976011
}
59986012

59996013
void createSymbolDatabaseIncompleteVars()

0 commit comments

Comments
 (0)