diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index c0571ae93..224fcb5f1 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -1565,6 +1565,17 @@ std::list Preprocessor::getcfgs(const std::string &filedata, const ret.sort(); ret.unique(); + // C code => remove __cplusplus configurations.. + if (!cplusplus(&_settings, filename) && Path::isC(filename)) { + for (std::list::iterator it = ret.begin(); it != ret.end();) { + if (it->find("__cplusplus") != std::string::npos) { + ret.erase(it++); + } else { + ++it; + } + } + } + // cleanup unhandled configurations.. for (std::list::iterator it = ret.begin(); it != ret.end();) { const std::string s(*it + ";"); diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 61b2c8dfb..b6ae9a3a2 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -316,10 +316,10 @@ private: return preprocessor0.read(istr, "test.c"); } - void preprocess(const char* code, std::map& actual) { + void preprocess(const char* code, std::map& actual, const char filename[] = "file.c") { errout.str(""); std::istringstream istr(code); - preprocessor0.preprocess(istr, actual, "file.c"); + preprocessor0.preprocess(istr, actual, filename); } @@ -429,61 +429,32 @@ private: void Bug2190219() { - const char filedata[] = "int main()\n" - "{\n" - "#ifdef __cplusplus\n" - " int* flags = new int[10];\n" + const char filedata[] = "#ifdef __cplusplus\n" + "cpp\n" "#else\n" - " int* flags = (int*)malloc((10)*sizeof(int));\n" - "#endif\n" - "\n" - "#ifdef __cplusplus\n" - " delete [] flags;\n" - "#else\n" - " free(flags);\n" - "#endif\n" - "}\n"; + "c\n" + "#endif"; - // Expected result.. - std::map expected; - expected[""] = "int main()\n" - "{\n" - "\n" - "\n" - "\n" - "int* flags = (int*)malloc((10)*sizeof(int));\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "free(flags);\n" - "\n" - "}\n"; + { + // Preprocess => actual result.. + std::map actual; + preprocess(filedata, actual, "file.cpp"); - expected["__cplusplus"] = "int main()\n" - "{\n" - "\n" - "int* flags = new int[10];\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "delete [] flags;\n" - "\n" - "\n" - "\n" - "}\n"; + // Compare results.. + ASSERT_EQUALS(1U, actual.size()); + ASSERT_EQUALS("\ncpp\n\n\n\n", actual[""]); + } - // Preprocess => actual result.. - std::map actual; - preprocess(filedata, actual); + { + // Ticket #7102 - skip __cplusplus in C code + // Preprocess => actual result.. + std::map actual; + preprocess(filedata, actual, "file.c"); - // Compare results.. - ASSERT_EQUALS(2, static_cast(actual.size())); - ASSERT_EQUALS(expected[""], actual[""]); - ASSERT_EQUALS(expected["__cplusplus"], actual["__cplusplus"]); + // Compare results.. + ASSERT_EQUALS(1U, actual.size()); + ASSERT_EQUALS("\n\n\nc\n\n", actual[""]); + } }