diff --git a/clang/lib/Lex/PPExpressions.cpp b/clang/lib/Lex/PPExpressions.cpp index a202af774256a0..cf7e32bee2e71d 100644 --- a/clang/lib/Lex/PPExpressions.cpp +++ b/clang/lib/Lex/PPExpressions.cpp @@ -903,9 +903,8 @@ Preprocessor::EvaluateDirectiveExpression(IdentifierInfo *&IfNDefMacro, SourceLocation ExprStartLoc = SourceMgr.getExpansionLoc(Tok.getLocation()); if (EvaluateValue(ResVal, Tok, DT, true, *this)) { // Parse error, skip the rest of the macro line. - SourceRange ConditionRange = ExprStartLoc; if (Tok.isNot(tok::eod)) - ConditionRange = DiscardUntilEndOfDirective(Tok); + DiscardUntilEndOfDirective(Tok); // Restore 'DisableMacroExpansion'. DisableMacroExpansion = DisableMacroExpansionAtStartOfDirective; @@ -916,7 +915,7 @@ Preprocessor::EvaluateDirectiveExpression(IdentifierInfo *&IfNDefMacro, return {std::nullopt, false, DT.IncludedUndefinedIds, - {ExprStartLoc, ConditionRange.getEnd()}}; + {ExprStartLoc, Tok.getLocation()}}; } EvaluatedDefined = DT.State != DefinedTracker::Unknown; @@ -948,8 +947,10 @@ Preprocessor::EvaluateDirectiveExpression(IdentifierInfo *&IfNDefMacro, // Restore 'DisableMacroExpansion'. DisableMacroExpansion = DisableMacroExpansionAtStartOfDirective; - SourceRange ValRange = ResVal.getRange(); - return {std::nullopt, false, DT.IncludedUndefinedIds, ValRange}; + return {std::nullopt, + false, + DT.IncludedUndefinedIds, + {ExprStartLoc, Tok.getLocation()}}; } if (CheckForEoD) { diff --git a/clang/unittests/Lex/PPCallbacksTest.cpp b/clang/unittests/Lex/PPCallbacksTest.cpp index 15385c13879d3f..c2a84d974dd396 100644 --- a/clang/unittests/Lex/PPCallbacksTest.cpp +++ b/clang/unittests/Lex/PPCallbacksTest.cpp @@ -237,14 +237,13 @@ class PPCallbacksTest : public ::testing::Test { } std::vector - DirectiveExprRange(StringRef SourceText) { + DirectiveExprRange(StringRef SourceText, PreprocessorOptions PPOpts = {}) { HeaderSearchOptions HSOpts; TrivialModuleLoader ModLoader; std::unique_ptr Buf = llvm::MemoryBuffer::getMemBuffer(SourceText); SourceMgr.setMainFileID(SourceMgr.createFileID(std::move(Buf))); HeaderSearch HeaderInfo(HSOpts, SourceMgr, Diags, LangOpts, Target.get()); - PreprocessorOptions PPOpts; Preprocessor PP(PPOpts, Diags, LangOpts, SourceMgr, HeaderInfo, ModLoader, /*IILookup=*/nullptr, /*OwnsHeaderSearch=*/false); PP.Initialize(*Target); @@ -569,6 +568,24 @@ TEST_F(PPCallbacksTest, DirectiveExprRanges) { Lexer::getSourceText(CharSourceRange(Results8[0].ConditionRange, false), SourceMgr, LangOpts), "__FILE__ > FLOOFY"); + + const char *MultiExprIf = "#if defined(FLOOFY) || defined(FLUZZY)\n#endif\n"; + const auto &Results9 = DirectiveExprRange(MultiExprIf); + EXPECT_EQ(Results9.size(), 1U); + EXPECT_EQ( + Lexer::getSourceText(CharSourceRange(Results9[0].ConditionRange, false), + SourceMgr, LangOpts), + "defined(FLOOFY) || defined(FLUZZY)"); + + PreprocessorOptions PPOptsSingleFileParse; + PPOptsSingleFileParse.SingleFileParseMode = true; + const auto &Results10 = + DirectiveExprRange(MultiExprIf, PPOptsSingleFileParse); + EXPECT_EQ(Results10.size(), 1U); + EXPECT_EQ( + Lexer::getSourceText(CharSourceRange(Results10[0].ConditionRange, false), + SourceMgr, LangOpts), + "defined(FLOOFY) || defined(FLUZZY)"); } } // namespace