diff --git a/src/lib_cxx/data/parser/cxx/CxxDiagnosticConsumer.cpp b/src/lib_cxx/data/parser/cxx/CxxDiagnosticConsumer.cpp index 3b88d6aa..c1625e5a 100644 --- a/src/lib_cxx/data/parser/cxx/CxxDiagnosticConsumer.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxDiagnosticConsumer.cpp @@ -83,7 +83,13 @@ void CxxDiagnosticConsumer::HandleDiagnostic(clang::DiagnosticsEngine::Level lev column = presumedLocation.getColumn(); } - const clang::FileEntry* fileEntry = sourceManager.getFileEntryForID(sourceManager.getFileID(info.getLocation())); + clang::SourceLocation loc = sourceManager.getExpansionLoc(info.getLocation()); + if (loc.isInvalid()) + { + loc = info.getLocation(); + } + + const clang::FileEntry* fileEntry = sourceManager.getFileEntryForID(sourceManager.getFileID(loc)); if (fileEntry != nullptr && fileEntry->isValid()) { filePath = m_canonicalFilePathCache->getCanonicalFilePath(fileEntry); diff --git a/src/test/CxxParserTestSuite.h b/src/test/CxxParserTestSuite.h index 08959685..eb0e7288 100644 --- a/src/test/CxxParserTestSuite.h +++ b/src/test/CxxParserTestSuite.h @@ -4057,6 +4057,18 @@ public: )); } + void test_cxx_parser_catches_error_in_macro_expansion() + { + std::shared_ptr client = parseCode( + "#define MACRO_WITH_NONEXISTING_PATH \"this_path_does_not_exist.txt\"\n" + "#include MACRO_WITH_NONEXISTING_PATH\n" + ); + + TS_ASSERT(utility::containsElement( + client->errors, L"'this_path_does_not_exist.txt' file not found <2:10 2:10>" + )); + } + void test_cxx_parser_finds_location_of_line_comment() { std::shared_ptr client = parseCode(