From 331c3e8c263a241741fbb884b57a274ed52c59e4 Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Tue, 8 May 2018 23:28:55 +0200 Subject: [PATCH] logic: fixed c/c++ indexing errors are not recorded inside macro expansion (issue #580) --- .../data/parser/cxx/CxxDiagnosticConsumer.cpp | 8 +++++++- src/test/CxxParserTestSuite.h | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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(