In 46803 we have an unknown attribute that apparently takes an identifier as its first argument; since my introduction of attribute_takes_identifier_p, we assume that most attributes do not take an identifier as their first argument. But it won't hurt to assume the contrary for unknown attributes, since we're just going to ignore them anyway.

Tested x86_64-pc-linux-gnu, applied to trunk.
commit c530bce3d9db3b334ea12bde6cb17e95f0048636
Author: Jason Merrill <ja...@redhat.com>
Date:   Fri Mar 11 14:09:30 2011 -0500

        PR c++/46803
        * c-common.c (attribute_takes_identifier_p): Assume that an
        unknown attribute takes an identifier.

diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index f029661..32b9a70 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -5665,9 +5665,14 @@ c_init_attributes (void)
 bool
 attribute_takes_identifier_p (const_tree attr_id)
 {
-  if (is_attribute_p ("mode", attr_id)
-      || is_attribute_p ("format", attr_id)
-      || is_attribute_p ("cleanup", attr_id))
+  struct attribute_spec *spec = lookup_attribute_spec (attr_id);
+  if (spec == NULL)
+    /* Unknown attribute that we'll end up ignoring, return true so we
+       don't complain about an identifier argument.  */
+    return true;
+  else if (!strcmp ("mode", spec->name)
+          || !strcmp ("format", spec->name)
+          || !strcmp ("cleanup", spec->name))
     return true;
   else
     return targetm.attribute_takes_identifier_p (attr_id);
diff --git a/gcc/testsuite/g++.dg/ext/attrib40.C 
b/gcc/testsuite/g++.dg/ext/attrib40.C
new file mode 100644
index 0000000..9c3f761
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attrib40.C
@@ -0,0 +1,4 @@
+// PR c++/46803
+
+int strftime(char *, int, const char *, const struct tm *)
+        __attribute__ ((__bounded__(__string__,1,2))); // { dg-warning 
"ignored" }

Reply via email to