From 87f607d069bdec6277b05be675742827b2e9ef75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 6 Nov 2026 16:08:33 +0100 Subject: [PATCH 1/2] Fix #720 (#if: wrong macro usage for macros defined before the #if) --- simplecpp.cpp | 9 ++++++--- test.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/simplecpp.cpp b/simplecpp.cpp index d034e969..c35a8adf 100644 --- a/simplecpp.cpp +++ b/simplecpp.cpp @@ -3935,10 +3935,11 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL const bool par = (tok && tok->op == '('); if (par) tok = tok->next; - maybeUsedMacros[rawtok->next->str()].emplace_back(rawtok->next->location); if (tok) { - if (macros.find(tok->str()) != macros.end()) + if (macros.find(tok->str()) != macros.end()) { + maybeUsedMacros[tok->str()].emplace_back(tok->location); expr.push_back(new Token("1", tok->location)); + } else if (hasInclude && tok->str() == HAS_INCLUDE) expr.push_back(new Token("1", tok->location)); else @@ -4004,7 +4005,9 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL continue; } - maybeUsedMacros[rawtok->next->str()].emplace_back(rawtok->next->location); + // usage of defined macros is recorded when they are expanded + if (macros.find(tok->str()) == macros.end()) + maybeUsedMacros[tok->str()].emplace_back(tok->location); const Token *tmp = tok; if (!preprocessToken(expr, tmp, macros, files, outputList, dui)) { diff --git a/test.cpp b/test.cpp index f87009f8..2561e3bf 100644 --- a/test.cpp +++ b/test.cpp @@ -4697,6 +4697,30 @@ static void macroUsage() ASSERT_EQUALS(2, it->useLocation.line); ASSERT_EQUALS(8, it->useLocation.col); } + { + const char code[] = "#define X 1\n" + "#if defined(X)\n" + "#endif\n"; + std::list macroUsage; + ASSERT_EQUALS("", preprocess(code, ¯oUsage)); + ASSERT_EQUALS(1, macroUsage.size()); + auto it = macroUsage.cbegin(); + ASSERT_EQUALS("X", it->macroName); + ASSERT_EQUALS(2, it->useLocation.line); + ASSERT_EQUALS(13, it->useLocation.col); + } + { + const char code[] = "#define X 1\n" + "#if X\n" + "#endif\n"; + std::list macroUsage; + ASSERT_EQUALS("", preprocess(code, ¯oUsage)); + ASSERT_EQUALS(1, macroUsage.size()); + auto it = macroUsage.cbegin(); + ASSERT_EQUALS("X", it->macroName); + ASSERT_EQUALS(2, it->useLocation.line); + ASSERT_EQUALS(5, it->useLocation.col); + } } static void isAbsolutePath() { From bfe2281a3a47c57e98298fa537da8b76e6157b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 6 Nov 2026 16:13:08 +0100 Subject: [PATCH 2/2] Fix clang-tidy readability-inconsistent-ifelse-braces --- simplecpp.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/simplecpp.cpp b/simplecpp.cpp index c35a8adf..bdec34a6 100644 --- a/simplecpp.cpp +++ b/simplecpp.cpp @@ -3939,11 +3939,11 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL if (macros.find(tok->str()) != macros.end()) { maybeUsedMacros[tok->str()].emplace_back(tok->location); expr.push_back(new Token("1", tok->location)); - } - else if (hasInclude && tok->str() == HAS_INCLUDE) + } else if (hasInclude && tok->str() == HAS_INCLUDE) { expr.push_back(new Token("1", tok->location)); - else + } else { expr.push_back(new Token("0", tok->location)); + } } if (par) tok = tok ? tok->next : nullptr;