Properly fix #46

This commit is contained in:
Jonathan Müller 2018-03-28 17:15:48 +02:00
commit 8255455533
3 changed files with 16 additions and 20 deletions

View file

@ -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
{

View file

@ -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<cpp_file> libclang_parser::do_parse(const cpp_entity_index& idx, std::string path,
const compile_config& c) const try

View file

@ -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();
}