From 2004780ea623825765e7a29b911403bcfa50ce00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Mon, 19 Mar 2018 21:41:28 +0100 Subject: [PATCH] Add (crude) workaround for _DEBUGGER_STEP_INTO #line in MSVC Fixes #46. --- src/libclang/preprocessor.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/libclang/preprocessor.cpp b/src/libclang/preprocessor.cpp index 8b25018..b43fa6f 100644 --- a/src/libclang/preprocessor.cpp +++ b/src/libclang/preprocessor.cpp @@ -88,7 +88,8 @@ namespace } // parse and log diagnostic - void log_diagnostic(const diagnostic_logger& logger, const std::string& msg) + // returns true if a diagnostic was logged due to a bug, but it is otherwise harmless + bool log_diagnostic(const diagnostic_logger& logger, const std::string& msg) { auto ptr = msg.c_str(); @@ -104,7 +105,13 @@ namespace while (*ptr && *ptr != '\n') message.push_back(*ptr++); + // see https://github.com/foonathan/cppast/issues/46 + auto harmless_diag = + message.find("invalid filename for #line directive") != std::string::npos; + logger.log("preprocessor", diagnostic{std::move(message), std::move(loc), sev}); + + return harmless_diag; } // parses missing header file diagnostic and returns the file name, @@ -349,6 +356,8 @@ namespace std::string write_macro_file(const libclang_compile_config& c, const std::string& full_path, const diagnostic_logger& logger) { + auto expect_bad_exit_code = false; + std::string diagnostic; auto diagnostic_logger = [&](const char* str, std::size_t n) { diagnostic.reserve(diagnostic.size() + n); @@ -358,7 +367,7 @@ namespace else if (*str == '\n') { // consume current diagnostic - log_diagnostic(logger, diagnostic); + expect_bad_exit_code |= log_diagnostic(logger, diagnostic); diagnostic.clear(); } else @@ -381,7 +390,7 @@ namespace auto exit_code = process.get_exit_status(); DEBUG_ASSERT(diagnostic.empty(), detail::assert_handler{}); - if (exit_code != 0) + if (exit_code != 0 && !expect_bad_exit_code) throw libclang_error("preprocessor (macro): command '" + cmd + "' exited with non-zero exit code (" + std::to_string(exit_code) + ")"); @@ -423,7 +432,7 @@ namespace expect_bad_exit_code = true; } else - log_diagnostic(logger, diagnostic); + expect_bad_exit_code |= log_diagnostic(logger, diagnostic); diagnostic.clear(); }