From d2b9c1f15a29d33d474857de2a8449b635136a13 Mon Sep 17 00:00:00 2001 From: rebnridgway Date: Fri, 2 Aug 2019 18:55:08 +0100 Subject: [PATCH] Fix some bugs in new Scope Calculation code (#2060) * Fix for too much information in scope name When the scope calculation encounters code such as "friend class X::Y;" or "template<> class X {" it will now reset the additional name component of the scope that is about to be opened. * Made sure new scope name is reset after being used --- lib/token.cpp | 1 + lib/tokenize.cpp | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/token.cpp b/lib/token.cpp index 50fd91473..f3a60e2fa 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -1059,6 +1059,7 @@ void Token::insertToken(const std::string &tokenStr, const std::string &original if (!newScopeInfo->name.empty() && !nextScopeNameAddition.empty()) newScopeInfo->name.append(" :: "); newScopeInfo->name.append(nextScopeNameAddition); + nextScopeNameAddition = ""; newToken->scopeInfo(newScopeInfo); } else if (tokenStr == "}") { diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index ef3f542c3..9667bb7fe 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2873,7 +2873,11 @@ void Tokenizer::calculateScopes() if (usingNamespaceName.length() > 0) usingNamespaceName = usingNamespaceName.substr(0, usingNamespaceName.length() - 1); tok->scopeInfo()->usingNamespaces.insert(usingNamespaceName); } else if (Token::Match(tok, "namespace|class|struct|union %name% {|::|:|<")) { - for (Token* nameTok = tok->next(); nameTok && !Token::Match(nameTok, "{|:|<"); nameTok = nameTok->next()) { + for (Token* nameTok = tok->next(); nameTok && !Token::Match(nameTok, "{|:"); nameTok = nameTok->next()) { + if (Token::Match(nameTok, ";|<")) { + nextScopeNameAddition = ""; + break; + } nextScopeNameAddition.append(nameTok->str()); nextScopeNameAddition.append(" "); }