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,6 +31,10 @@ namespace
template <class Builder> template <class Builder>
void add_parameters(const detail::parse_context& context, Builder& builder, const CXCursor& cur) void add_parameters(const detail::parse_context& context, Builder& builder, const CXCursor& cur)
{ {
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) { detail::visit_children(cur, [&](const CXCursor& child) {
if (clang_getCursorKind(child) != CXCursor_ParmDecl) if (clang_getCursorKind(child) != CXCursor_ParmDecl)
return; return;
@ -46,6 +50,23 @@ namespace
} }
}); });
} }
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) bool is_templated_cursor(const CXCursor& cur)
{ {

View file

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

View file

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