https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106741
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- /* If we haven't already defined a front-end-specific diagnostics style, use the generic one. */ #ifdef GCC_DIAG_STYLE #define GCC_PPDIAG_STYLE GCC_DIAG_STYLE #else #define GCC_PPDIAG_STYLE __gcc_diag__ #endif /* This header may be included before diagnostics-core.h, hence the duplicate definitions to allow for GCC-specific formats. */ #if GCC_VERSION >= 3005 #define ATTRIBUTE_GCC_PPDIAG(m, n) __attribute__ ((__format__ (GCC_PPDIAG_STYLE, m ,n))) ATTRIBUTE_NONNULL(m) #else #define ATTRIBUTE_GCC_PPDIAG(m, n) ATTRIBUTE_NONNULL(m) #endif extern void pp_printf (pretty_printer *, const char *, ...) ATTRIBUTE_GCC_PPDIAG(2,3); %qE support was added for GCC 8, with r8-499-631238ac3f50 . So if you are compiling with GCC 7 (or before), the first stage will warn about an unknown conversion type character āEā but the 2nd and 3rd stages won't.