То, что вы можете приводить типы, не означает, что компилятор с радостью сделает это за вас.
В этом случае определение указателя функции не совпадает. C не будет предполагать, что функция, объявленная для получения int*
, будет рада вместо void*
, даже если преобразование между этими двумя типами неявно. Это тонкое замечание в том, как C обрабатывает указатели на функции.
Если вы хотите, чтобы это работало без предупреждений, вам придется разыграть следующее:
func2(%a, (func_t)func);