From e990cfb76bae9336ae9f4e5cd9452fd7f5e7e22b Mon Sep 17 00:00:00 2001 From: PKEuS Date: Wed, 18 Nov 2015 21:13:58 +0100 Subject: [PATCH] Fixed setVarId() for destructors --- lib/tokenize.cpp | 17 ++++++++++++----- test/testvarid.cpp | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 72721811e..bc5d785b8 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2885,11 +2885,14 @@ void Tokenizer::setVarId() std::list allMemberVars; if (!isC()) { for (Token *tok2 = list.front(); tok2; tok2 = tok2->next()) { - if (Token::Match(tok2, "%name% :: %name%")) { + if (Token::Match(tok2, "%name% :: ~| %name%")) { const Token* tok3 = tok2->next(); do { - tok3 = tok3->tokAt(2); - } while (Token::Match(tok3, ":: %name%")); + tok3 = tok3->next(); + if (tok3->str() == "~") + tok3 = tok3->next(); + tok3 = tok3->next(); + } while (Token::Match(tok3, ":: ~| %name%")); if (!tok3) syntaxError(tok2); const std::string& str3 = tok3->str(); @@ -2961,14 +2964,18 @@ void Tokenizer::setVarId() continue; // Set variable ids in member functions for this class.. - const std::string funcpattern(classname + " :: %name% ("); + const std::string funcpattern(classname + " :: ~| %name% ("); for (std::list::iterator func = allMemberFunctions.begin(); func != allMemberFunctions.end(); ++func) { Token *tok2 = *func; // Found a class function.. if (Token::Match(tok2, funcpattern.c_str())) { // Goto the end parentheses.. - tok2 = tok2->linkAt(nestedCount*2+1); + tok2 = tok2->tokAt(nestedCount*2); + if (tok2 && tok2->str() == "~") + tok2 = tok2->linkAt(2); + else + tok2 = tok2->linkAt(1); if (!tok2) break; diff --git a/test/testvarid.cpp b/test/testvarid.cpp index 818a16a76..97bb96bd2 100644 --- a/test/testvarid.cpp +++ b/test/testvarid.cpp @@ -119,6 +119,7 @@ private: TEST_CASE(varid_in_class16); TEST_CASE(varid_in_class17); // #6056 - no varid for member functions TEST_CASE(varid_in_class18); // #7127 + TEST_CASE(varid_in_class19); TEST_CASE(varid_initList); TEST_CASE(varid_initListWithBaseTemplate); TEST_CASE(varid_operator); @@ -1765,6 +1766,24 @@ private: "10: { }\n", tokenize(code, false, "test.cpp")); } + void varid_in_class19() { + const char code[] = "class Fred {\n" + " char *str1;\n" + " ~Fred();\n" + "};\n" + "Fred::~Fred() {\n" + " free(str1);\n" + "}"; + ASSERT_EQUALS("\n\n##file 0\n" + "1: class Fred {\n" + "2: char * str1@1 ;\n" + "3: ~ Fred ( ) ;\n" + "4: } ;\n" + "5: Fred :: ~ Fred ( ) {\n" + "6: free ( str1@1 ) ;\n" + "7: }\n", tokenize(code, false, "test.cpp")); + } + void varid_initList() { const char code1[] = "class A {\n" " A() : x(0) {}\n"