https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83117
--- Comment #5 from Martin Sebor <msebor at gcc dot gnu.org> --- C requires that every function must be declared and called by [an expression of] a compatible type and specifies special rules for the ellipsis and for functions without a prototype. For two function types to be compatible, ... If one type has a parameter type list and the other type is specified by a function declarator that is not part of a function definition and that contains an empty identifier list, the parameter list shall not have an ellipsis terminator. In the snippet in comment #2: extern long do_test_aligned (); static long (*const do_test_v1) (long a, ...) = (void *) do_test_aligned; do_test_v1 (a); do_test_aligned has an empty identifier list and do_test_v1's parameter list ends in an ellipsis, making the two incompatible. So either the call is undefined or the two declarations of do_test_aligned, one without a prototype and one with (matching do_test_v1, in some other translation unit), are undefined. I don't know if GCC supports any targets where this incompatibility is, in fact, undefined. If not, then perhaps the warning in this specific case should only be issued with -Wpedantic. In any event, I think the warning should have an option controlling it. The phrasing could also be improved: both the established term and the preferred English word is "incompatible" (not "non-compatible").