Fixed #3405 ((error) Invalid number of character ({) when these macros are def ined: 'WIN32'.)

This commit is contained in:
Daniel Marjamäki 2011-12-13 21:14:41 +01:00
parent 4cad5d4df4
commit 34fba9e1ea
2 changed files with 50 additions and 6 deletions

View File

@ -1779,7 +1779,7 @@ std::string Preprocessor::handleIncludes(const std::string &code, const std::str
if (line.compare(0,7,"#ifdef ") == 0) { if (line.compare(0,7,"#ifdef ") == 0) {
if (indent == indentmatch) { if (indent == indentmatch) {
std::string tag = getdef(line,true); const std::string tag = getdef(line,true);
if (defs.find(tag) != defs.end()) { if (defs.find(tag) != defs.end()) {
elseIsTrue = false; elseIsTrue = false;
indentmatch++; indentmatch++;
@ -1795,7 +1795,7 @@ std::string Preprocessor::handleIncludes(const std::string &code, const std::str
elseIsTrue = true; elseIsTrue = true;
} else if (line.compare(0,8,"#ifndef ") == 0) { } else if (line.compare(0,8,"#ifndef ") == 0) {
if (indent == indentmatch) { if (indent == indentmatch) {
std::string tag = getdef(line,false); const std::string tag = getdef(line,false);
if (defs.find(tag) == defs.end()) { if (defs.find(tag) == defs.end()) {
elseIsTrue = false; elseIsTrue = false;
indentmatch++; indentmatch++;
@ -1804,11 +1804,12 @@ std::string Preprocessor::handleIncludes(const std::string &code, const std::str
indentmatch++; indentmatch++;
suppressCurrentCodePath = false; suppressCurrentCodePath = false;
} }
++indent;
if (indent == indentmatch + 1)
elseIsTrue = true;
} }
++indent;
if (indent == indentmatch + 1)
elseIsTrue = true;
} else if (!suppressCurrentCodePath && line.compare(0,4,"#if ") == 0) { } else if (!suppressCurrentCodePath && line.compare(0,4,"#if ") == 0) {
if (indent == indentmatch && match_cfg_def(defs, line.substr(4))) { if (indent == indentmatch && match_cfg_def(defs, line.substr(4))) {
elseIsTrue = false; elseIsTrue = false;

View File

@ -234,6 +234,7 @@ private:
// Defines are given: test Preprocessor::handleIncludes // Defines are given: test Preprocessor::handleIncludes
TEST_CASE(def_handleIncludes); TEST_CASE(def_handleIncludes);
TEST_CASE(def_missingInclude); TEST_CASE(def_missingInclude);
TEST_CASE(def_handleIncludes_ifelse); // problems in handleIncludes for #else
// Using -U to undefine symbols // Using -U to undefine symbols
TEST_CASE(undef1); TEST_CASE(undef1);
@ -3043,6 +3044,48 @@ private:
} }
} }
void def_handleIncludes_ifelse() {
const std::string filePath("test.c");
const std::list<std::string> includePaths;
std::map<std::string,std::string> defs;
Preprocessor preprocessor(NULL, this);
// #3405
{
defs.clear();
defs["A"] = "";
const std::string code("\n#ifndef PAL_UTIL_UTILS_H_\n"
"#define PAL_UTIL_UTILS_H_\n"
"1\n"
"#ifndef USE_BOOST\n"
"2\n"
"#else\n"
"3\n"
"#endif\n"
"4\n"
"#endif\n"
"\n"
"#ifndef PAL_UTIL_UTILS_H_\n"
"#define PAL_UTIL_UTILS_H_\n"
"5\n"
"#ifndef USE_BOOST\n"
"6\n"
"#else\n"
"7\n"
"#endif\n"
"8\n"
"#endif\n"
"\n");
std::string actual(preprocessor.handleIncludes(code,filePath,includePaths,defs));
// the 1,2,4 should be in the result
actual.erase(0, actual.find("1"));
while (actual.find("\n") != std::string::npos)
actual.erase(actual.find("\n"),1);
ASSERT_EQUALS("124", actual);
}
}
void undef1() { void undef1() {
Settings settings; Settings settings;