Jason Merrill <ja...@redhat.com> writes: > On 03/20/2015 12:48 PM, Jakub Jelinek wrote: >> On Fri, Mar 20, 2015 at 12:30:44PM -0400, Jason Merrill wrote: >>> On 03/11/2015 03:10 PM, Jakub Jelinek wrote: >>>> __has_{cpp_,}attribute builtin macros are effectively function-like macros >>>> taking one argument (and the ISO preprocessor expands macros in the >>>> argument >>>> which is IMHO desirable), but the traditional preprocessor has been >>>> crashing >>>> on them or reporting errors. >>> >>> Why do we want ISO preprocessor behavior in this specific situation? >> >> You mean that we would handle >> #define U unused >> #if __has_attribute(U) >> int u __attribute__((unused)); >> #endif >> differently between ISO and traditional preprocessing? > >> That would be surprising to users. > > Why surprising? Don't users of the traditional preprocessor expect > traditional preprocessor behavior?
One of the reasons why I thought it'd be "nice" to have the traditionnal mode support the macro-expansion of the arguments here is that there already are cases where the traditionnal mode supports ISO behaviour. For instance, the documentation of cpp says: 10.3 Traditional miscellany =========================== Here are some things to be aware of when using the traditional preprocessor. [...] * A true traditional C preprocessor does not recognize '#error' or '#pragma', and may not recognize '#elif'. CPP supports all the directives in traditional mode that it supports in ISO mode, including extensions, with the exception that the effects of '#pragma GCC poison' are undefined. So I thought this useful particular use case of __has_attribute(U) might well be another of such case even if it's not a directive. Just my 2 cents. -- Dodji