preprocessor: handle redefinition of macro

This commit is contained in:
Daniel Marjamäki 2009-01-22 20:19:07 +00:00
parent e897637c7a
commit 67e4ea10c9
2 changed files with 25 additions and 3 deletions

View File

@ -678,10 +678,16 @@ std::string Preprocessor::expandMacros(std::string code)
// #undef => break // #undef => break
if (code[pos1] == '#') if (code[pos1] == '#')
{ {
const std::string substr(code.substr(pos1, 7 + macro.name().length())); std::string substr;
substr = code.substr(pos1, 7 + macro.name().length());
if (substr == "#undef " + macro.name()) if (substr == "#undef " + macro.name())
break; break;
else
substr = code.substr(pos1, 8 + macro.name().length());
if (substr == "#define " + macro.name())
break;
continue; continue;
} }

View File

@ -83,10 +83,12 @@ private:
TEST_CASE(string1); TEST_CASE(string1);
TEST_CASE(string2); TEST_CASE(string2);
TEST_CASE(preprocessor_undef); TEST_CASE(preprocessor_undef);
TEST_CASE(defdef); // Defined multiple times
TEST_CASE(preprocessor_doublesharp); TEST_CASE(preprocessor_doublesharp);
TEST_CASE(preprocessor_include_in_str); TEST_CASE(preprocessor_include_in_str);
// TODO TEST_CASE(fmt); // TODO TEST_CASE(fmt);
TEST_CASE(multi_character_character); TEST_CASE(multi_character_character);
} }
@ -559,6 +561,17 @@ private:
ASSERT_EQUALS("\n\n\nchar b=0;\n", Preprocessor::expandMacros(filedata)); ASSERT_EQUALS("\n\n\nchar b=0;\n", Preprocessor::expandMacros(filedata));
} }
void defdef()
{
const char filedata[] = "#define AAA 123\n"
"#define AAA 456\n"
"#define AAA 789\n"
"AAA\n";
// Compare results..
ASSERT_EQUALS("\n\n\n789\n", Preprocessor::expandMacros(filedata));
}
void preprocessor_doublesharp() void preprocessor_doublesharp()
{ {
const char filedata[] = "#define TEST(var,val) var = val\n" const char filedata[] = "#define TEST(var,val) var = val\n"
@ -596,6 +609,8 @@ private:
} }
void fmt() void fmt()
{ {
const char filedata[] = "#define DBG(fmt...) printf(fmt)\n" const char filedata[] = "#define DBG(fmt...) printf(fmt)\n"
@ -627,6 +642,7 @@ private:
ASSERT_EQUALS("\nint main()\n{\nif( 'ABCD' == 0 );\nreturn 0;\n}\n", actual[""]); ASSERT_EQUALS("\nint main()\n{\nif( 'ABCD' == 0 );\nreturn 0;\n}\n", actual[""]);
} }
}; };
REGISTER_TEST(TestPreprocessor) REGISTER_TEST(TestPreprocessor)