diff --git a/src/cpp_token.cpp b/src/cpp_token.cpp index 8664f33..e1b1df1 100644 --- a/src/cpp_token.cpp +++ b/src/cpp_token.cpp @@ -216,7 +216,7 @@ namespace for (; is_digit(*ptr) || *ptr == '\''; ++ptr) if (*ptr != '\'') result += *ptr; - DEBUG_ASSERT(result.back() != '\'', detail::assert_handler{}); + DEBUG_ASSERT(result.empty() || result.back() != '\'', detail::assert_handler{}); return result; } @@ -569,7 +569,7 @@ namespace return type_safe::nullopt; } -} +} // namespace cpp_token_string cpp_token_string::tokenize(std::string str) { @@ -605,7 +605,7 @@ namespace { return std::isalnum(c) || c == '_'; } -} +} // namespace std::string cpp_token_string::as_string() const { diff --git a/src/libclang/libclang_parser.cpp b/src/libclang/libclang_parser.cpp index 3edecd7..fe13f96 100644 --- a/src/libclang/libclang_parser.cpp +++ b/src/libclang/libclang_parser.cpp @@ -91,7 +91,7 @@ namespace } return result; } -} +} // namespace libclang_compile_config::libclang_compile_config() : compile_config({}), @@ -150,7 +150,7 @@ namespace // relative w/o separator return dir.std_str() + file; } -} +} // namespace void detail::for_each_file(const libclang_compilation_database& database, void* user_data, void (*callback)(void*, std::string)) @@ -226,7 +226,7 @@ namespace // else skip argument } } -} +} // namespace libclang_compile_config::libclang_compile_config(const libclang_compilation_database& database, const std::string& file) @@ -303,7 +303,12 @@ void libclang_compile_config::do_set_flags(cpp_standard standard, compile_flags } if (flags & compile_flag::ms_compatibility) + { add_flag("-fms-compatibility"); + // see https://github.com/foonathan/cppast/issues/46 + define_macro("_DEBUG_FUNCTIONAL_MACHINERY", ""); + } + if (flags & compile_flag::ms_extensions) add_flag("-fms-extensions"); } @@ -484,7 +489,7 @@ namespace clang_getPresumedLocation(loc, nullptr, &line, nullptr); return line; } -} +} // namespace std::unique_ptr libclang_parser::do_parse(const cpp_entity_index& idx, std::string path, const compile_config& c) const try diff --git a/src/libclang/preprocessor.cpp b/src/libclang/preprocessor.cpp index 9ccdcad..8d8564c 100644 --- a/src/libclang/preprocessor.cpp +++ b/src/libclang/preprocessor.cpp @@ -88,8 +88,7 @@ namespace } // parse and log diagnostic - // 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) + void log_diagnostic(const diagnostic_logger& logger, const std::string& msg) { auto ptr = msg.c_str(); @@ -105,13 +104,7 @@ 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, @@ -362,8 +355,6 @@ 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); @@ -373,7 +364,7 @@ namespace else if (*str == '\n') { // consume current diagnostic - expect_bad_exit_code |= log_diagnostic(logger, diagnostic); + log_diagnostic(logger, diagnostic); diagnostic.clear(); } else @@ -396,7 +387,7 @@ namespace auto exit_code = process.get_exit_status(); DEBUG_ASSERT(diagnostic.empty(), detail::assert_handler{}); - if (exit_code != 0 && !expect_bad_exit_code) + if (exit_code != 0) throw libclang_error("preprocessor (macro): command '" + cmd + "' exited with non-zero exit code (" + std::to_string(exit_code) + ")"); @@ -438,7 +429,7 @@ namespace expect_bad_exit_code = true; } else - expect_bad_exit_code |= log_diagnostic(logger, diagnostic); + log_diagnostic(logger, diagnostic); diagnostic.clear(); }