https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91092
--- Comment #18 from Rich Felker <bugdal at aerifal dot cx> --- Just to clarify, an "implicit function declaration" is use of a token that could be an identifier as the operand of the function call operator (), with no declaration for the identifier in scope. A non-prototype declaration is still a declaration. The specific language from C89 supporting implicit function declarations is in 3.3.2.2 ΒΆ4: "If the expression that precedes the parenthesized argument list in a function call consists solely of an identifier, and if no declaration is visible for this identifier, the identifier is implicitly declared exactly as if, in the innermost block containing the function call, the declaration extern int identifier(); appeared." Later versions of the standard do not have such a special case; the operand has to be a valid expression with function pointer type.