https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116892
--- Comment #10 from Richard Earnshaw <rearnsha at gcc dot gnu.org> --- (In reply to uecker from comment #9) > (In reply to Richard Earnshaw from comment #8) > > Forward declarations of enums in C requires c23, when you can use the size > > type specifier. For earlier versions this isn't valid code. > > Is is a GNU extension: > https://gcc.gnu.org/onlinedocs/gcc/Enum-Extensions.html <quote> GCC has also traditionally supported forward declarations of enum types that don’t include an explicit underlying type specification. This results in an incomplete type, much like what you get if you write struct foo without describing the elements. <em>You cannot allocate variables or storage using the type while it is incomplete. </em> However, you can work with pointers to that type. </quote> So a prototype passing/returning a value is essentially defining the amount of storage the parameter would need for passing (to allow for sizing the parameter list). That falls under the unsupported cases in situations like #c2.