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

Reply via email to