https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65238
Marek Polacek <mpolacek at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |NEW
--- Comment #3 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
This patch seems to make __has_attribute work even in traditional cpp:
--- a/libcpp/traditional.c
+++ b/libcpp/traditional.c
@@ -497,6 +497,18 @@ _cpp_scan_out_logical_line (cpp_reader *pfile, cpp_macro
*macro)
fmacro.line = pfile->line_table->highest_line;
continue;
}
+ else if ((node->flags & NODE_BUILTIN) != 0
+ && node->value.builtin == BT_HAS_ATTRIBUTE)
+ {
+ pfile->out.cur = out_start;
+ /* Skip "__has_attribute". */
+ _cpp_lex_token (pfile);
+ push_replacement_text (pfile, node);
+ /* Get rid of "(arg)" in the context. */
+ CUR (context) = pfile->buffer->cur;
+ lex_state = ls_none;
+ goto new_context;
+ }
else if (!recursive_macro (pfile, node))
{
/* Remove the object-like macro's name from the
However there are other issues, so I'm afraid this will need more surgery than
that, so I'm dropping this for now :(.
1) We ICE with or without the patch on following valid code:
#define D unused
#if __has_attribute(D)
int i;
#endif
2) We ICE on the following invalid code with the patch:
#if __has_attribute(
int i;
#endif