Skip to content

Commit 96ade8d

Browse files
committed
fixed cppcheck-opensource#73 - nested conditions containing defined(smth) are not expanded
1 parent d81861d commit 96ade8d

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

simplecpp.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,6 +1471,25 @@ namespace simplecpp {
14711471
return tok2->next;
14721472
}
14731473

1474+
else if (tok->str == DEFINED) {
1475+
const Token *tok2 = tok->next;
1476+
const Token *tok3 = tok2 ? tok2->next : NULL;
1477+
const Token *tok4 = tok3 ? tok3->next : NULL;
1478+
const Token *defToken = NULL;
1479+
const Token *lastToken = NULL;
1480+
if (sameline(tok, tok4) && tok2->op == '(' && tok3->name && tok4->op == ')') {
1481+
defToken = tok3;
1482+
lastToken = tok4;
1483+
} else if (sameline(tok,tok2) && tok2->name) {
1484+
defToken = lastToken = tok2;
1485+
}
1486+
if (defToken) {
1487+
const bool def = (macros.find(defToken->str) != macros.end());
1488+
output->push_back(newMacroToken(def ? "1" : "0", loc, true));
1489+
return lastToken->next;
1490+
}
1491+
}
1492+
14741493
output->push_back(newMacroToken(tok->str, loc, true));
14751494
return tok->next;
14761495
}

test.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,41 @@ void ifDefined()
642642
ASSERT_EQUALS("\nX", preprocess(code, dui));
643643
}
644644

645+
void ifDefinedNoPar()
646+
{
647+
const char code[] = "#if defined A\n"
648+
"X\n"
649+
"#endif";
650+
simplecpp::DUI dui;
651+
ASSERT_EQUALS("", preprocess(code, dui));
652+
dui.defines.push_back("A=1");
653+
ASSERT_EQUALS("\nX", preprocess(code, dui));
654+
}
655+
656+
void ifDefinedNested()
657+
{
658+
const char code[] = "#define FOODEF defined(FOO)\n"
659+
"#if FOODEF\n"
660+
"X\n"
661+
"#endif";
662+
simplecpp::DUI dui;
663+
ASSERT_EQUALS("", preprocess(code, dui));
664+
dui.defines.push_back("FOO=1");
665+
ASSERT_EQUALS("\n\nX", preprocess(code, dui));
666+
}
667+
668+
void ifDefinedNestedNoPar()
669+
{
670+
const char code[] = "#define FOODEF defined FOO\n"
671+
"#if FOODEF\n"
672+
"X\n"
673+
"#endif";
674+
simplecpp::DUI dui;
675+
ASSERT_EQUALS("", preprocess(code, dui));
676+
dui.defines.push_back("FOO=1");
677+
ASSERT_EQUALS("\n\nX", preprocess(code, dui));
678+
}
679+
645680
void ifDefinedInvalid1() // #50 - invalid unterminated defined
646681
{
647682
const char code[] = "#if defined(A";
@@ -1276,6 +1311,9 @@ int main(int argc, char **argv)
12761311
TEST_CASE(ifA);
12771312
TEST_CASE(ifCharLiteral);
12781313
TEST_CASE(ifDefined);
1314+
TEST_CASE(ifDefinedNoPar);
1315+
TEST_CASE(ifDefinedNested);
1316+
TEST_CASE(ifDefinedNestedNoPar);
12791317
TEST_CASE(ifDefinedInvalid1);
12801318
TEST_CASE(ifDefinedInvalid2);
12811319
TEST_CASE(ifLogical);

0 commit comments

Comments
 (0)