>
>
> On Thu, Sep 7, 2023 at 6:09 PM Eric Blake <ebl...@redhat.com> wrote:
>
>> On Wed, Sep 06, 2023 at 03:08:33PM -0700, Mike Fulton wrote:
>> > Hello,
>> >
>> > The m4 dev line ( git://git.savannah.gnu.org/m4.git )
>> > has the following code:
>> >
>> > ```
>> > #if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
>> > # pragma GCC diagnostic push
>> > # pragma GCC diagnostic ignored "-Wformat-nonliteral"
>> > #endif
>> > ```
>>
>> That expression appears to be designed to reject gcc 3.5 and older,
>> while accepting 3.6 and newer.
>>
> Right - that's my understanding.
>
>>
>> I also wonder if modern gnulib provides a better way to test things
>> than just open-coding it (as Bruno has done a lot of work testing
>> features of newer compilers).  This may be one case where ignoring the
>> diagnostic for older builds is desirable - there comes a point where
>> you can't please both old and new compilers simultaneously, but the
>> target that should be warning-free is the newer compiler.
>>
> Great question - this seems to be something added before clang and I
> wonder if there is a better way to manage diagnostics that are meant
> to be 'sort of common?' between GCC and clang. I've just started
> using clang on z/OS so I'm not sure how this mapping is done for
> GCC compatibility.
>
>>
>> That is, maybe it's time to just rewrite the check to something as
>> simple as #if 8 <= __GNUC__ (that is, only add the pragmas on a much
>> newer, albeit arbitrary, point in time)?
>>
>> Conversely, I see that m4 uses gnulib's lib/c-stack.c, which also has:
>>
>> /* Pacify GCC 9.3.1, which otherwise would complain about segv_handler.
>> */
>> # if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
>> #  pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
>> # endif
>>
>> so it's not like m4 is doing anything radically different from gnulib
>> when it comes to pragmas for ignoring certain diagnostics; but thd
>> difference may be which diagnostic is being ignored.
>>
>> >
>> > This produces an error on the clang compiler I am using on z/OS, which
>> is
>> > at 4.2 with the xasprintf code that follows, e.g.
>> >
>> > ```
>> > str = xasprintf (fstart, width, ARG_INT(argc, argv));
>> > ```
>> >
>> > If I change the check to:
>> >
>> > ```
>> > #if 4 < __GNUC__ + (2 <= __GNUC_MINOR__)
>> > # pragma GCC diagnostic push
>> > # pragma GCC diagnostic ignored "-Wformat-nonliteral"
>> > #endif
>> > ```
>> >
>> > all is good - it compiles clean. The question is whether the check for
>> 6 is
>> > too high or if the clang compiler on z/OS has a bug (or something else)?
>>
>> What does clang claim to be?  That is, what do you get for
>>   print '__GNUC__ __GNUC_MINOR__' | clang -E - | tail -n1
>>
> On both z/OS as well as my Mac I see:
>  4 2
>
>>
>> and what is the actual compiler error you got when the build failed on
>> the original source?
>>
>   CC       format.o
> format.c:360:28: error: format string is not a string literal 
> [-Werror,-Wformat-nonliteral]
>           str = xasprintf (fstart, width, ARG_INT(argc, argv));
>
>                            ^~~~~~
>
>>
>> > I haven't been able to determine what level of gcc provides this
>> diagnostic.
>>
>
What if we just acknowledged the clang compiler and changed the check to:

#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) || defined(__clang__)

?

> >
>> > thanks, mike
>>
>> --
>> Eric Blake, Principal Software Engineer
>> Red Hat, Inc.
>> Virtualization:  qemu.org | libguestfs.org
>>
>>

Reply via email to