public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: "Martin Storsjö" <martin@martin.st>
To: "mingw-w64-public@lists.sourceforge.net"
	<mingw-w64-public@lists.sourceforge.net>
Cc: "gcc-help@gcc.gnu.org" <gcc-help@gcc.gnu.org>
Subject: Re: [Mingw-w64-public] mingw-w64 and __attribute__((format(printf))) issue
Date: Wed, 6 May 2020 13:48:42 +0300 (EEST)	[thread overview]
Message-ID: <alpine.DEB.2.20.2005061256580.23006@cone.martin.st> (raw)
In-Reply-To: <84f2a94f-0d73-fe05-78c6-bd64c1f8ee76@126.com>

On Wed, 6 May 2020, Liu Hao wrote:

> Due to a recent change in mingw-w64 master [1], libgomp ceases to build:
>
> ```
> ../../../gcc-git/libgomp/target.c:936:21: error: unknown conversion type
> character 'l' in format [-Werror=format=]
>  936 |         gomp_fatal ("present clause: !acc_is_present (%p, "
>      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> ```
>
>
> On line 29 of 'libgomp/libgomp.h' from GCC 9 branch I found this declaration
>
> ```
> extern void gomp_fatal (const char *, ...)
>        __attribute__ ((noreturn, format (printf, 1, 2)));
> ```
>
> , which uses the `printf` attribute, but the `PRIu64` macro from
> <inttypes.h> expands to `%llu` because now GCC has `-std=gnu11` by
> default, which is only valid with `gnu_printf`.
>
> AFAICS there are three solutions:
>
> 1. Revert bfd33f6c0ec5e652cc9911857dd1492ece8d8383 in mingw-w64, or

This is generally the risk of this kind of commit - regardless of how 
right/wrong the status quo is, there's _a lot_ of code that relies on it 
behaving in a specific way, and changing that will certainly run into 
minor issues in a lot of places.

> 2. Make GCC treat `format(printf)` as `format(gnu_printf)` if C11 or
>   C++11 is selected, or

I'm not very keen on that. The compiler should ideally not assume to much 
about what the platform headers do in detail, because it limits what we 
can change. (If we'd make that change in the compiler, and then for 
another reason end up reverting the commit, we'd have the same issue in 
reverse.)

> 3. Replace `format(printf)` with `format(gnu_printf)` in libgomp source.

This also kind of hardcodes too much; libgomp in general can't and 
shouldn't assume too much about which format kind it uses, unless libgomp 
itself hardcodes __USE_MINGW_ANSI_STDIO. Also, the whole gnu_printf format 
is something that only GCC supports, not Clang, but I guess libgomp is 
rather GCC specific anyway.

However we do have a define that should expand to the right thing - just 
like inttypes.h PRIu64 follows __USE_MINGW_ANSI_STDIO - we have 
__MINGW_PRINTF_FORMAT.

So something like this should work:

#ifdef __MINGW32__
#define PRINTF_FORMAT __MINGW_PRINTF_FORMAT
#else
#define PRINTF_FORMAT printf
#endif

__attribute__((format(PRINTF_FORMAT)))

Not very pretty, but should work without hardcoding any assumptions about 
which format actually is used.


// Martin


  reply	other threads:[~2020-05-06 10:48 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-06  5:36 Liu Hao
2020-05-06 10:48 ` Martin Storsjö [this message]
2020-05-06 12:45   ` [Mingw-w64-public] " Liu Hao
2020-05-07  4:09   ` Liu Hao
2020-05-10  4:27 ` JonY
2020-05-10  9:03   ` Liu Hao
2020-05-12 11:14     ` JonY
2020-05-12 12:02       ` Jakub Jelinek
2020-05-12 13:15         ` Liu Hao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.DEB.2.20.2005061256580.23006@cone.martin.st \
    --to=martin@martin.st \
    --cc=gcc-help@gcc.gnu.org \
    --cc=mingw-w64-public@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).