https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83584

--- Comment #16 from Tim Rentsch <txr at alumni dot caltech.edu> ---
(In reply to Andrew Pinski from comment #14)
> -pedantic is not designed to reject all programs that are not strictly
> conforming, but to enable emitting all _required_ diagnostics.  I
> don't think a conversion between function and object pointer type
> requires a diagnostic.

A conversion between function and object pointer type does not require a
diagnostic.  The point of my comment is that rejecting a program on that
basis is consistent with the Standard.  Moreover, it is reasonable for
gcc to reject such a program on that basis, as explained below.

The -pedantic option is not designed to reject all programs that are not
strictly conforming.  Indeed it could not do so because detecting exactly
those cases is not computable.

I agree that the -pedantic option is meant to enable emitting all required
diagnostics.  But it is not meant to emit _only_ those diagnostics that
the Standard requires.  For example, there is this case:

    static int foo[];  /* given a size later in the source */

Compiling with -pedantic (note: not -pedantic-errors!) and no other
options gives

     error: array size missing in 'foo'

This construct is syntactically valid and has no constraint violations,
yet it is rejected under -pedantic.  (Rejecting the program is okay
because the construct itself has undefined behavior, under 6.9.2 p3.)

I believe -pedantic is meant to accept(*) only those programs that are
accepted by other compilers that strictly follow what ISO C requires
(assuming the same type sizes, etc).  That is, -pedantic is meant to be
conservative, allowing only those programs that any other conforming
implementation would not reject.  Hence it is reasonable for -pedantic to
reject the construct shown above, because some implementations might not
be able to handle it.  For the same reasons it is reasonable for -pedantic
to reject programs with a conversion between an object pointer type and a
function pointer type.  More strongly, it would be _un_reasonable for such
a program to be allowed under -pedantic-errors, because they very likely
would be rejected by other conforming implementations;  allowing such
programs pretty much defeats the purpose of -pedantic.

(*) Here "accept" is meant in the sense of not issuing any diagnostics
for, regardless of whether the diagnostics are warnings or errors.

Reply via email to