From 84830638a22987e32379ecfe02c088d054f8813e Mon Sep 17 00:00:00 2001 From: Frank Zingsheim Date: Thu, 9 Apr 2015 21:09:31 +0200 Subject: [PATCH] Improved fix #6636: (False positive unreadVariable - scope analysis seems to fail to False positive unreadVariable) --- lib/tokenize.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 4f76eaeab..3326d12ac 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -80,14 +80,17 @@ static const Token * isFunctionHead(const Token *tok, const std::string &endsWit return nullptr; } -static bool isClassStructUnionStart(const Token * tok) +/** + * is tok the start brace { of a class, struct, union, or enum + */ +static bool isClassStructUnionEnumStart(const Token * tok) { - if (tok->str() != "{") + if (!Token::Match(tok->previous(), "class|struct|union|enum|%name%|>|>> {")) return false; const Token * tok2 = tok->previous(); - while (tok2 && !Token::Match(tok2, "class|struct|union|{|;")) + while (tok2 && !Token::Match(tok2, "class|struct|union|enum|{|}|;")) tok2 = tok2->previous(); - return Token::Match(tok2, "class|struct|union"); + return Token::Match(tok2, "class|struct|union|enum"); } //--------------------------------------------------------------------------- @@ -2612,7 +2615,7 @@ void Tokenizer::setVarId() isExecutable = true; } else { isExecutable = ((scopeStack.top().isExecutable || initlist || tok->strAt(-1) == "else") && - !isClassStructUnionStart(tok)); + !isClassStructUnionEnumStart(tok)); scopeInfo.push(variableId); } initlist = false;