Fixed #4863 (macros not propagated)
This commit is contained in:
parent
a5636d55bc
commit
e4270bab78
|
@ -1543,6 +1543,7 @@ void Preprocessor::simplifyCondition(const std::map<std::string, std::string> &c
|
||||||
modified = false;
|
modified = false;
|
||||||
modified |= tokenizer.simplifySizeof();
|
modified |= tokenizer.simplifySizeof();
|
||||||
modified |= tokenizer.simplifyCalculations();
|
modified |= tokenizer.simplifyCalculations();
|
||||||
|
modified |= tokenizer.simplifyConstTernaryOp();
|
||||||
modified |= tokenizer.simplifyRedundantParentheses();
|
modified |= tokenizer.simplifyRedundantParentheses();
|
||||||
for (Token *tok = const_cast<Token *>(tokenizer.tokens()); tok; tok = tok->next()) {
|
for (Token *tok = const_cast<Token *>(tokenizer.tokens()); tok; tok = tok->next()) {
|
||||||
if (Token::Match(tok, "! %num%")) {
|
if (Token::Match(tok, "! %num%")) {
|
||||||
|
@ -1728,13 +1729,18 @@ std::string Preprocessor::getcode(const std::string &filedata, const std::string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (line.compare(0,4,"#if ") == 0) {
|
||||||
|
matching_ifdef.push_back(match_cfg_def(cfgmap, line.substr(4)));
|
||||||
|
matched_ifdef.push_back(matching_ifdef.back());
|
||||||
|
}
|
||||||
|
|
||||||
else if (! def.empty()) {
|
else if (! def.empty()) {
|
||||||
matching_ifdef.push_back(match_cfg_def(cfgmap, def));
|
matching_ifdef.push_back(cfgmap.find(def) != cfgmap.end());
|
||||||
matched_ifdef.push_back(matching_ifdef.back());
|
matched_ifdef.push_back(matching_ifdef.back());
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (! ndef.empty()) {
|
else if (! ndef.empty()) {
|
||||||
matching_ifdef.push_back(! match_cfg_def(cfgmap, ndef));
|
matching_ifdef.push_back(cfgmap.find(ndef) == cfgmap.end());
|
||||||
matched_ifdef.push_back(matching_ifdef.back());
|
matched_ifdef.push_back(matching_ifdef.back());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,7 @@ private:
|
||||||
TEST_CASE(define_if3);
|
TEST_CASE(define_if3);
|
||||||
TEST_CASE(define_if4); // #4079 - #define X +123
|
TEST_CASE(define_if4); // #4079 - #define X +123
|
||||||
TEST_CASE(define_if5); // #4516 - #define B (A & 0x00f0)
|
TEST_CASE(define_if5); // #4516 - #define B (A & 0x00f0)
|
||||||
|
TEST_CASE(define_if6); // #4863 - #define B (A?-1:1)
|
||||||
TEST_CASE(define_ifdef);
|
TEST_CASE(define_ifdef);
|
||||||
TEST_CASE(define_ifndef1);
|
TEST_CASE(define_ifndef1);
|
||||||
TEST_CASE(define_ifndef2);
|
TEST_CASE(define_ifndef2);
|
||||||
|
@ -2771,6 +2772,27 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void define_if6() { // #4516 - #define B (A?1:-1)
|
||||||
|
const char filedata[] = "#ifdef A\n"
|
||||||
|
"#define B (A?1:-1)\n"
|
||||||
|
"#endif\n"
|
||||||
|
"\n"
|
||||||
|
"#if B < 0\n"
|
||||||
|
"123\n"
|
||||||
|
"#endif\n"
|
||||||
|
"\n"
|
||||||
|
"#if B >= 0\n"
|
||||||
|
"456\n"
|
||||||
|
"#endif\n";
|
||||||
|
Preprocessor preprocessor(NULL, this);
|
||||||
|
const std::string actualA0 = preprocessor.getcode(filedata, "A=0", "test.c");
|
||||||
|
ASSERT_EQUALS(true, actualA0.find("123") != std::string::npos);
|
||||||
|
ASSERT_EQUALS(false, actualA0.find("456") != std::string::npos);
|
||||||
|
const std::string actualA1 = preprocessor.getcode(filedata, "A=1", "test.c");
|
||||||
|
ASSERT_EQUALS(false, actualA1.find("123") != std::string::npos);
|
||||||
|
ASSERT_EQUALS(true, actualA1.find("456") != std::string::npos);
|
||||||
|
}
|
||||||
|
|
||||||
void define_ifdef() {
|
void define_ifdef() {
|
||||||
{
|
{
|
||||||
const char filedata[] = "#define ABC\n"
|
const char filedata[] = "#define ABC\n"
|
||||||
|
@ -2830,7 +2852,7 @@ private:
|
||||||
|
|
||||||
{
|
{
|
||||||
const char filedata[] = "#define A 1\n"
|
const char filedata[] = "#define A 1\n"
|
||||||
"#ifdef A>0\n"
|
"#if A>0\n"
|
||||||
"A\n"
|
"A\n"
|
||||||
"#endif\n";
|
"#endif\n";
|
||||||
|
|
||||||
|
@ -3123,7 +3145,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void predefine1() {
|
void predefine1() {
|
||||||
const std::string src("#ifdef X || Y\n"
|
const std::string src("#if defined X || Y\n"
|
||||||
"Fred & Wilma\n"
|
"Fred & Wilma\n"
|
||||||
"#endif\n");
|
"#endif\n");
|
||||||
|
|
||||||
|
@ -3134,7 +3156,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void predefine2() {
|
void predefine2() {
|
||||||
const std::string src("#ifdef X && Y\n"
|
const std::string src("#if defined(X) && Y\n"
|
||||||
"Fred & Wilma\n"
|
"Fred & Wilma\n"
|
||||||
"#endif\n");
|
"#endif\n");
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue