diff --git a/simplecpp.cpp b/simplecpp.cpp index d034e969..bdec34a6 100644 --- a/simplecpp.cpp +++ b/simplecpp.cpp @@ -3935,14 +3935,15 @@ 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) + } 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; @@ -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() {