Fix issue with functions returning functions

This commit is contained in:
Jonathan Müller 2017-03-31 15:20:41 +02:00
commit e9e9a3bbc5
3 changed files with 38 additions and 17 deletions

View file

@ -31,20 +31,41 @@ namespace
template <class Builder>
void add_parameters(const detail::parse_context& context, Builder& builder, const CXCursor& cur)
{
detail::visit_children(cur, [&](const CXCursor& child) {
if (clang_getCursorKind(child) != CXCursor_ParmDecl)
return;
if (clang_getCursorKind(cur) == CXCursor_FunctionTemplate)
{
// clang_Cursor_getNumArguments() doesn't work here
// (of course it doesn't...)
detail::visit_children(cur, [&](const CXCursor& child) {
if (clang_getCursorKind(child) != CXCursor_ParmDecl)
return;
try
{
auto parameter = parse_parameter(context, child);
builder.add_parameter(std::move(parameter));
}
catch (detail::parse_error& ex)
{
context.logger->log("libclang parser", ex.get_diagnostic());
}
});
try
{
auto parameter = parse_parameter(context, child);
builder.add_parameter(std::move(parameter));
}
catch (detail::parse_error& ex)
{
context.logger->log("libclang parser", ex.get_diagnostic());
}
});
}
else
{
auto no = clang_Cursor_getNumArguments(cur);
DEBUG_ASSERT(no != -1, detail::parse_error_handler{}, cur,
"unexpected number of arguments");
for (auto i = 0; i != no; ++i)
try
{
auto parameter = parse_parameter(context, clang_Cursor_getArgument(cur, i));
builder.add_parameter(std::move(parameter));
}
catch (detail::parse_error& ex)
{
context.logger->log("libclang parser", ex.get_diagnostic());
}
}
}
bool is_templated_cursor(const CXCursor& cur)

View file

@ -15,13 +15,13 @@ TEST_CASE("code_generator")
struct foo{
int a;
auto func(int)->int(*)[];
auto func(int)->int(*(*)(int))[42];
private:
int const b=42;
};
int(*(foo::* mptr)(int))[];
int(*(*(foo::* mptr)(int))(int))[42];
enum class bar
:int{

View file

@ -32,8 +32,8 @@ inline std::unique_ptr<cppast::cpp_file> parse(const cppast::cpp_entity_index& i
libclang_compile_config config;
config.set_flags(cpp_standard::cpp_latest);
static stderr_diagnostic_logger logger;
libclang_parser p(type_safe::ref(logger));
stderr_diagnostic_logger logger;
libclang_parser p(type_safe::ref(logger));
auto result = p.parse(idx, name, config);
REQUIRE(!logger.error_logged());