===================================================================
@@ -2162,7 +2162,10 @@
result.high = 0;
result.overflow = false;
- result.low = pfile->cb.has_attribute (pfile);
+ if (pfile->cb.has_attribute)
+ result.low = pfile->cb.has_attribute (pfile);
+ else
+ result.low = 0;
pfile->state.in__has_attribute__--;
===================================================================
@@ -306,7 +306,6 @@
if (token->type == CPP_NAME)
{
- //node = token->val.node.node;
const cpp_token *nxt_token = cpp_peek_token (pfile, 0);
if (c_dialect_cxx() && nxt_token->type == CPP_SCOPE)
{
===================================================================
@@ -80,6 +80,7 @@
static void cb_def_pragma (cpp_reader *, source_location);
static void cb_read_pch (cpp_reader *pfile, const char *name,
int fd, const char *orig_name);
+static int cb_has_attribute (cpp_reader *);
/* Preprocess and output. */
void
@@ -129,6 +130,8 @@
}
}
+ cb->has_attribute = cb_has_attribute;
+
if (flag_dump_includes)
cb->include = cb_include;
@@ -510,6 +513,48 @@
print.src_line++;
}
+static int
+cb_has_attribute (cpp_reader * pfile)
+{
+ bool paren = false;
+ const cpp_token * token = cpp_get_token (pfile);
+
+ fputs ("__has_attribute__ ", print.outf);
+
+ if (token->type == CPP_OPEN_PAREN)
+ {
+ paren = true;
+ token = cpp_get_token (pfile);
+ putc ('(', print.outf);
+ }
+ if (token->type == CPP_NAME)
+ {
+ const cpp_token *nxt_token = cpp_peek_token (pfile, 0);
+ if (c_dialect_cxx() && nxt_token->type == CPP_SCOPE)
+ {
+ nxt_token = cpp_get_token (pfile); // Eat scope.
+ nxt_token = cpp_get_token (pfile);
+ if (nxt_token->type == CPP_NAME)
+ {
+ fprintf (print.outf, "%s::%s",
+ cpp_token_as_text (pfile, token),
+ cpp_token_as_text (pfile, nxt_token));
+ }
+ }
+ else
+ {
+ fprintf (print.outf, "%s", cpp_token_as_text (pfile, token));
+ }
+ }
+ if (paren)
+ {
+ cpp_get_token (pfile);
+ putc (')', print.outf);
+ }
+
+ return 0;
+}
+
static void
cb_undef (cpp_reader *pfile ATTRIBUTE_UNUSED, source_location line,
cpp_hashnode *node)
===================================================================
@@ -0,0 +1,4 @@
+// { dg-do compile }
+// { dg-options "-I${srcdir}/g++.dg/cpp1y -MM" }
+
+#include <pr63831.h>
===================================================================
@@ -0,0 +1,7 @@
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+#if __has_attribute(alloc_size)
+# define U_ALLOC_SIZE_ATTR(X) __attribute__ ((alloc_size(X)))
+#endif