From f7cbc90c847e691738a767585597d1e25d57d810 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Tue, 15 Mar 2011 23:28:45 -0400 Subject: [PATCH] fix #2581 (### Internal error in Cppcheck. Please report it.) --- lib/tokenize.cpp | 15 ++++++++++++++- test/testsimplifytokens.cpp | 20 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 3d34aa61f..226b19d39 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -1245,6 +1245,10 @@ void Tokenizer::simplifyTypedef() if (tok->strAt(offset + 1) == "(") offset++; + if (tok->tokAt(offset)->link()->strAt(-2) == "*") + functionPtr = true; + else + function = true; funcStart = tok->tokAt(offset + 1); funcEnd = tok->tokAt(offset)->link()->tokAt(-2); typeName = tok->tokAt(offset)->link()->previous(); @@ -1528,6 +1532,15 @@ void Tokenizer::simplifyTypedef() if (simplifyType) { + // can't simplify 'operator functionPtr ()' and 'functionPtr operator ... ()' + if (functionPtr && (tok2->previous()->str() == "operator" || + tok2->next()->str() == "operator")) + { + simplifyType = false; + tok2 = tok2->next(); + break; + } + // There are 2 categories of typedef substitutions: // 1. variable declarations that preserve the variable name like // global, local, and function parameters @@ -9472,7 +9485,7 @@ void Tokenizer::simplifyOperatorName() par = par->next(); done = false; } - if (Token::Match(par, "[<>+-*&/=.]") || Token::Match(par, "==|!=|<=|>=")) + if (Token::Match(par, "[<>+-*&/=.!]") || Token::Match(par, "==|!=|<=|>=")) { op += par->str(); par = par->next(); diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index ae77e430a..e188946fd 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -247,6 +247,7 @@ private: TEST_CASE(simplifyTypedef83); // ticket #2620 TEST_CASE(simplifyTypedef84); // ticket #2630 TEST_CASE(simplifyTypedef85); // ticket #2651 + TEST_CASE(simplifyTypedef86); // ticket #2581 TEST_CASE(simplifyTypedefFunction1); TEST_CASE(simplifyTypedefFunction2); // ticket #1685 @@ -4996,6 +4997,25 @@ private: ASSERT_EQUALS("", errout.str()); } + void simplifyTypedef86() // ticket #2581 + { + const char code[] = "class relational {\n" + " typedef void (safe_bool_helper::*safe_bool)();\n" + "public:\n" + " operator safe_bool() const;\n" + " safe_bool operator!() const;\n" + "};\n"; + const char expected[] = "class relational { " + "; " + "public: " + "operatorsafe_bool ( ) const ; " + "safe_bool operator! ( ) const ; " + "} ;"; + checkSimplifyTypedef(code); + ASSERT_EQUALS(expected, sizeof_(code)); + ASSERT_EQUALS("", errout.str()); + } + void simplifyTypedefFunction1() { {