New simplification: Remove 'extern "C"' from C++ code.

Refactorization in cppcheck.cpp: Catch exception as const reference instead of non-const reference.
This commit is contained in:
PKEuS 2012-04-16 16:25:04 +02:00
parent 8cb904feaa
commit 1c3c94dc67
4 changed files with 27 additions and 2 deletions

View File

@ -225,7 +225,7 @@ unsigned int CppCheck::processFile(const std::string& filename)
++checkCount;
}
} catch (std::runtime_error &e) {
} catch (const std::runtime_error &e) {
// Exception was thrown when checking this file..
const std::string fixedpath = Path::toNativeSeparators(filename);
_errorLogger.reportOut("Bailing out from checking " + fixedpath + ": " + e.what());

View File

@ -1977,6 +1977,10 @@ bool Tokenizer::tokenize(std::istream &code,
// combine "- %num%"
concatenateNegativeNumber();
// remove extern "C" and extern "C" {}
if (isCPP())
simplifyExternC();
// simplify weird but legal code: "[;{}] ( { code; } ) ;"->"[;{}] code;"
simplifyRoundCurlyParenthesis();
@ -2451,6 +2455,20 @@ void Tokenizer::concatenateNegativeNumber()
}
}
void Tokenizer::simplifyExternC()
{
for (Token *tok = _tokens; tok; tok = tok->next()) {
if (Token::Match(tok, "extern \"C\" {|")) {
if (tok->strAt(2) == "{") {
tok->linkAt(2)->deleteThis();
tok->deleteNext(2);
} else
tok->deleteNext();
tok->deleteThis();
}
}
}
void Tokenizer::simplifyRoundCurlyParenthesis()
{
for (Token *tok = _tokens; tok; tok = tok->next()) {

View File

@ -489,6 +489,8 @@ public:
void concatenateNegativeNumber();
void simplifyExternC();
void simplifyRoundCurlyParenthesis();
void simplifyDebugNew();

View File

@ -161,6 +161,7 @@ private:
TEST_CASE(simplifyKnownVariablesBailOutSwitchBreak); // ticket #2324
TEST_CASE(simplifyKnownVariablesFloat); // #2454 - float variable
TEST_CASE(simplifyKnownVariablesClassMember); // #2815 - value of class member may be changed by function call
TEST_CASE(simplifyExternC);
TEST_CASE(varid1);
TEST_CASE(varid2);
@ -2508,6 +2509,10 @@ private:
}
}
void simplifyExternC() {
ASSERT_EQUALS("int foo ( ) ;", tokenizeAndStringify("extern \"C\" int foo();"));
ASSERT_EQUALS("int foo ( ) ;", tokenizeAndStringify("extern \"C\" { int foo(); }"));
}
std::string tokenizeDebugListing(const std::string &code, bool simplify = false, const char filename[] = "test.cpp") {
@ -3222,7 +3227,7 @@ private:
void varid40() {
const std::string code("extern \"C\" int (*a())();");
ASSERT_EQUALS("\n\n##file 0\n"
"1: extern \"C\" int ( * a ( ) ) ( ) ;\n",
"1: int ( * a ( ) ) ( ) ;\n",
tokenizeDebugListing(code));
}