From 208326f11d4cf879c372f7bd4b686dba88076182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 5 Aug 2026 14:59:46 +0200 Subject: [PATCH 1/3] add test --- test.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test.cpp b/test.cpp index 247f63e1..918577db 100644 --- a/test.cpp +++ b/test.cpp @@ -2388,6 +2388,17 @@ static void ifDefinedHashHash2() ASSERT_EQUALS("\n0", preprocess(code, &outputList)); } +static void ifDefinedHashHash3() +{ + const char code[] = "#define ENABLED(x) (defined(x ## _ENABLED) && (x ## _ENABLED))\n" + "#define FOO_ENABLED 1\n" + "#if ENABLED(FOO)\n" + "int x;\n" + "#endif\n"; + simplecpp::OutputList outputList; + ASSERT_EQUALS("\n\n\nint x ;", preprocess(code, &outputList)); +} + static void ifLogical() { const char code[] = "#if defined(A) || defined(B)\n" @@ -4701,6 +4712,7 @@ static void runTests(int argc, char **argv, Input input) TEST_CASE(ifDefinedInvalid2); TEST_CASE(ifDefinedHashHash); TEST_CASE(ifDefinedHashHash2); + TEST_CASE(ifDefinedHashHash3); TEST_CASE(ifLogical); TEST_CASE(ifSizeof); TEST_CASE(elif); From ce06610dc86236129e4fc0f310048a7b84bf94cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 5 Aug 2026 14:56:11 +0200 Subject: [PATCH 2/3] fix --- simplecpp.cpp | 53 ++++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/simplecpp.cpp b/simplecpp.cpp index 4b24e311..cb28e361 100644 --- a/simplecpp.cpp +++ b/simplecpp.cpp @@ -2249,33 +2249,38 @@ namespace simplecpp { } if (tok->str() == DEFINED) { - const Token * const tok2 = tok->next; - const Token * const tok3 = tok2 ? tok2->next : nullptr; - const Token * const tok4 = tok3 ? tok3->next : nullptr; - const Token *defToken = nullptr; - const Token *lastToken = nullptr; - if (sameline(tok, tok4) && tok2->op == '(' && tok3->name && tok4->op == ')') { - defToken = tok3; - lastToken = tok4; - } else if (sameline(tok,tok2) && tok2->name) { - defToken = lastToken = tok2; + std::string macroName; + TokenList temp(files); + const Token *argTok = tok->next; + bool expectParen = false; + if (argTok->op == '(') { + argTok = argTok->next; + expectParen = true; } - if (defToken) { - std::string macroName = defToken->str(); - if (defToken->next && defToken->next->op == '#' && defToken->next->next && defToken->next->next->op == '#' && defToken->next->next->next && defToken->next->next->next->name && sameline(defToken,defToken->next->next->next)) { - TokenList temp(files); - if (expandArg(temp, defToken, parametertokens)) - macroName = temp.cback()->str(); - if (expandArg(temp, defToken->next->next->next, parametertokens)) - macroName += temp.cback() ? temp.cback()->str() : ""; - else - macroName += defToken->next->next->next->str(); - lastToken = defToken->next->next->next; + while (argTok->name) { + if (expandArg(temp, argTok, parametertokens)) + macroName += temp.cback() ? temp.cback()->str() : ""; + else + macroName += argTok->str(); + argTok = argTok->next; + if (!sameline(tok, argTok)) + break; + if (argTok && argTok->str() == "#") { + if (!argTok->next || argTok->next->str() != "#") + throw Error(argTok->location, "Expected '#'"); + argTok = argTok->next->next; + } else { + break; } - const bool def = (macros.find(macroName) != macros.end()); - output.push_back(newMacroToken(def ? "1" : "0", loc, true)); - return lastToken->next; } + if (expectParen) { + if (!sameline(tok, argTok) && argTok->op != ')') + throw Error(argTok->location, "Expected ')'"); + argTok = argTok->next; + } + const bool def = (macros.find(macroName) != macros.end()); + output.push_back(newMacroToken(def ? "1" : "0", loc, true)); + return argTok; } output.push_back(newMacroToken(tok->str(), loc, true, tok)); From e56a09a3bd96c68b59fef26f7e0e935724b8524a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 5 Aug 2026 16:08:19 +0200 Subject: [PATCH 3/3] fixes --- simplecpp.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/simplecpp.cpp b/simplecpp.cpp index cb28e361..f13aef28 100644 --- a/simplecpp.cpp +++ b/simplecpp.cpp @@ -2265,10 +2265,12 @@ namespace simplecpp { argTok = argTok->next; if (!sameline(tok, argTok)) break; - if (argTok && argTok->str() == "#") { + if (argTok->str() == "#") { if (!argTok->next || argTok->next->str() != "#") throw Error(argTok->location, "Expected '#'"); argTok = argTok->next->next; + if (!sameline(tok, argTok) || !argTok->name) + throw Error(argTok->location, "Expected name"); } else { break; }