Here's another regression that was introduced by the patch: https://bugs.llvm.org/show_bug.cgi?id=37935 I landed a test for that in r335725 (in case you're wondering why there's a new test failure when you reland).
Thanks for working on this! On Tue, Jun 26, 2018 at 9:03 AM Michael Kruse via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Thank you for your reproducer. I debugged it and found the issue. > ngettext is defined as follows. > > extern char *ngettext (const char *__msgid1, const char *__msgid2, > unsigned long int __n) > throw () __attribute__ ((__format_arg__ (1))) __attribute__ > ((__format_arg__ (2))); > > Indeed, two format attributes (Just not the plain "format" I > expected). The code which is processing it from SemaChecking.cpp:5521 > > if (const FormatArgAttr *FA = ND->getAttr<FormatArgAttr>()) { > > That is, the code as written can process at most one FormatAttr and > takes the first one (which is a different one before and after my > patch). > > I suggest to change this to: > > for (const auto *FA : FDecl->specific_attrs<FormatAttr>()) { > > such that both arguments to ngettext are checked, as defined by the > attributes. That also means that emitting the warning is emitted with > and without my patch. > > Michael > > > > > > > > 2018-06-25 19:29 GMT-05:00 David Jones <d...@google.com>: > > (Sorry for the late reply...) > > > > On Mon, Jun 25, 2018 at 2:45 PM Michael Kruse via cfe-commits > > <cfe-commits@lists.llvm.org> wrote: > >> > >> I just revert if to have further discussions (r335516) > >> > >> Michael > >> > >> 2018-06-25 14:58 GMT-05:00 Eric Christopher <echri...@gmail.com>: > >> > > >> > > >> > On Mon, Jun 25, 2018 at 12:21 PM Richard Smith via cfe-commits > >> > <cfe-commits@lists.llvm.org> wrote: > >> >> > >> >> On 23 June 2018 at 22:34, Michael Kruse via cfe-commits > >> >> <cfe-commits@lists.llvm.org> wrote: > >> >>> > >> >>> Hi, > >> >>> > >> >>> multiple comments in the code indicate that the attribute order was > >> >>> surprising and probably has lead to bugs, and will lead to bugs in > the > >> >>> future. The order had to be explicitly reversed to avoid those. This > >> >>> alone for me this seems a good reason to have the attributes in the > >> >>> order in which they appear in the source. > >> >>> > >> >>> It would be nice it you could send a reproducer. At a glance, your > >> >>> case does not seem related since the format strings are function > >> >>> arguments, not attributes. > > > > > > Well, there is a nested function call, but the format warning applies to > two > > different parameters: a singular phrasing string, and a plural one. A > > reproducer would look like this, which is almost verbatim from the link: > > > > $ cat /tmp/repro.cc > > #include <libintl.h> > > #include <stdio.h> > > > > void foo(){ printf(ngettext("one frobber", "%lu frobbers", 0UL), 0UL); } > > $ <snip...>/bin/clang -Wall -c -o /dev/null /tmp/repro.cc > > /tmp/repro.cc:4:66: warning: data argument not used by format string > > [-Wformat-extra-args] > > void foo(){ printf(ngettext("one frobber", "%lu frobbers", 0UL), 0UL); } > > ~~~~~~~~~~~~~ ^ > > 1 warning generated. > > > > > > Swapping the string params works, and an older revision yields inverse > > results. > > > > > >> > >> >>> 2018-06-23 17:17 GMT-05:00 David Jones <d...@google.com>: > >> >>> > Since the semantics of the ordering of multiple format args seems > >> >>> > somewhat > >> >>> > ill-defined, it seems to me like reverting may be the best > near-term > >> >>> > choice. > >> >>> > I can imagine other ways to fix the diagnostic, but the only > >> >>> > behaviour > >> >>> > that > >> >>> > I would believe to be expected by existing code is the old one, > so a > >> >>> > change > >> >>> > like this one probably needs to be more carefully vetted before > >> >>> > being > >> >>> > (re-)committed. > >> >>> > >> >>> Could you give more details about your concerns? > > > > > > > > Multiple format strings (or repeating or reordering other attributes) > seems > > like it lacks clear semantics. I can't find any particularly > well-documented > > explanation of Clang's behaviour in these cases, which makes me suspect > that > > most people would just "fix it until it works" and move on. GCC's > > documentation doesn't seem to be very decisive, either. > > > > For example, you mentioned that multiple format attributes may be > invalid; > > if so, then rejecting such cases should probably be a part of the fix. > But > > that would require some vetting, since this (pretty clearly) doesn't > mirror > > the current reality. > > > > > >> >> (I'm not sure what the problem is, but as a data point, > Sema::checkCall > >> >> iterates over the FormatAttrs in order, so it's possible that > changing > >> >> the > >> >> order may have triggered a new warning. That may be due to a > >> >> pre-existing > >> >> order-dependence bug, or it may be that we're losing an attribute > >> >> here.) > > > > > > It's arguably a pre-existing order dependence bug in ngettext, but it > would > > be ... well, a fairly prevalent bug, since it could churn any such calls > > through libintl/gettext/etc. > > > >> > >> >>> > Please let me know your plan. (If I don't hear back in a day or > so, > >> >>> > I'll go > >> >>> > ahead and revert for you as the safe default course of action.) > >> >>> > >> >>> On a weekend? > >> >> > >> >> > >> >> Yes; our policy is generally to revert to green if a patch causes > >> >> regressions that aren't going to be fixed in a few hours. This is > >> >> generally > >> >> good for the committer, because it lets you figure out what's wrong > and > >> >> deal > >> >> with it on your own schedule rather than being pressured to fix it > >> >> urgently > >> >> because you're blocking the work of others. > > > > > > Well, the bug did repro on a weekend, so there's that. ;-) > > > > My main goal was to give a tighter response timeout to account for any > > timezone drift (with a target of Monday ~everywhere). > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits