Hello,
For the interested reader, I eventually solved the nested function issue
by using either nested functions or C++11 lambdas, depending on whether
g++ is being used [0].
This is abstracted away by these (surprisingly not-too-ugly) macros to
define a local function, and declare a function parameter:
#ifdef __cplusplus
/* G++ doesn't implement nested functions, so use C++11 lambdas instead. */
# include <functional>
# define local_define(ret, name, parms) auto name = [=]parms
# define function_parm(ret, name, parms) std::function<ret parms> name
#else /* !__cplusplus */
/* GNU C nested functions. */
# define local_define(ret, name, parms) ret name parms
# define function_parm(ret, name, parms) ret (*name) parms
#endif /* !__cplusplus */
They are used like this:
static tree
map (function_parm (tree, func, (const_tree)), tree t)
{
[...]
}
static tree
foo (tree lst, tree y)
{
local_define (tree, frob, (const_tree x))
{
return do_something (x, y);
};
return map (frob, lst);
}
Then there were other subtleties to work around, such as the lack of
support for designated initializers in g++.
Thanks,
Ludo’.
[0]
https://gforge.inria.fr/scm/viewvc.php/trunk/gcc-plugin/src/starpu.c?root=starpu&r1=6225&r2=6226