https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69864
--- Comment #10 from Manuel López-Ibáñez <manu at gcc dot gnu.org> --- (In reply to Markus Trippelsdorf from comment #9) > > * Create a new function in diagnostic.c, e.g., > > > > extern diagnostic_t pederror (location_t, int, const char *, ...) > > ATTRIBUTE_GCC_DIAG(3,4); > > > > and replace the kludge in cp/typeck2.c with it (possibly fixing PR69872 > > along the way). Document when some warnings might be errors (like we have > > precise definitions for permerror/pedwarn). > > The kludges are there because gcc used to emit an error even with > -Wno-narrowing. > That broke tons of existing C++ code. There is such a thing as QOI and that > means you have to use a compromise sometimes. This is the kludge I'm talking about: { int savederrorcount = errorcount; global_dc->pedantic_errors = 1; pedwarn (loc, OPT_Wnarrowing, "narrowing conversion of %qE from %qT to %qT " "inside { }", init, ftype, type); if (errorcount == savederrorcount) ok = true; global_dc->pedantic_errors = flag_pedantic_errors; } I'm just suggesting to created a pederror function to hide this uglyness and make such "diagnostics mandated by the standard for which we give an error but allow the user to downgrade to a warning" a properly defined and consistently behaved function before it extends by copy-pasting.