Fix issue with functions returning functions
This commit is contained in:
parent
9a0ac36715
commit
e9e9a3bbc5
3 changed files with 38 additions and 17 deletions
|
|
@ -31,20 +31,41 @@ 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)
|
||||||
{
|
{
|
||||||
detail::visit_children(cur, [&](const CXCursor& child) {
|
if (clang_getCursorKind(cur) == CXCursor_FunctionTemplate)
|
||||||
if (clang_getCursorKind(child) != CXCursor_ParmDecl)
|
{
|
||||||
return;
|
// 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
|
try
|
||||||
{
|
{
|
||||||
auto parameter = parse_parameter(context, child);
|
auto parameter = parse_parameter(context, child);
|
||||||
builder.add_parameter(std::move(parameter));
|
builder.add_parameter(std::move(parameter));
|
||||||
}
|
}
|
||||||
catch (detail::parse_error& ex)
|
catch (detail::parse_error& ex)
|
||||||
{
|
{
|
||||||
context.logger->log("libclang parser", ex.get_diagnostic());
|
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)
|
bool is_templated_cursor(const CXCursor& cur)
|
||||||
|
|
|
||||||
|
|
@ -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{
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@ 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);
|
||||||
REQUIRE(!logger.error_logged());
|
REQUIRE(!logger.error_logged());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue