re PR c++/33289 (__sprintf_chk etc. not DECL_ANTICIPATED)
authorJakub Jelinek <jakub@redhat.com>
Wed, 5 Sep 2007 23:27:17 +0000 (01:27 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 5 Sep 2007 23:27:17 +0000 (01:27 +0200)
PR c++/33289
* decl.c (builtin_function_1): Set DECL_ANTICIPATED also
on __*_chk non-__builtin_* decls.

* g++.dg/eh/builtin4.C: New test.

From-SVN: r128160

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/eh/builtin4.C [new file with mode: 0644]

index 07663ed..b8fb971 100644 (file)
@@ -3,6 +3,10 @@
        * decl.c (duplicate_decls): Set TREE_NOTHROW on __builtin_XX
        decl if a prototype for XX is provided with throw().
 
+       PR c++/33289
+       * decl.c (builtin_function_1): Set DECL_ANTICIPATED also
+       on __*_chk non-__builtin_* decls.
+
 2007-09-05  Paolo Carlini  <pcarlini@suse.de>
 
        PR c++/30302
index 311925a..9587de5 100644 (file)
@@ -3528,6 +3528,17 @@ builtin_function_1 (tree decl, tree context)
      anticipated but not actually declared.  */
   if (name[0] != '_' || name[1] != '_')
     DECL_ANTICIPATED (decl) = 1;
+  else if (strncmp (name + 2, "builtin_", strlen ("builtin_")) != 0)
+    {
+      size_t len = strlen (name);
+
+      /* Treat __*_chk fortification functions as anticipated as well,
+        unless they are __builtin_*.  */
+      if (len > strlen ("___chk")
+         && memcmp (name + len - strlen ("_chk"),
+                    "_chk", strlen ("_chk") + 1) == 0)
+       DECL_ANTICIPATED (decl) = 1;
+    }
 
   return decl;
 }
index 41ca76d..e6803a8 100644 (file)
@@ -4,6 +4,9 @@
        * g++.dg/eh/builtin2.C: New test.
        * g++.dg/eh/builtin3.C: New test.
 
+       PR c++/33289
+       * g++.dg/eh/builtin4.C: New test.
+
 2007-09-05  Janis Johnson  <janis187@us.ibm.com>
 
        * gcc.target/powerpc/dfp-dd.c: New test.
diff --git a/gcc/testsuite/g++.dg/eh/builtin4.C b/gcc/testsuite/g++.dg/eh/builtin4.C
new file mode 100644 (file)
index 0000000..3234817
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/33289
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" int __sprintf_chk (char *__restrict, int, size_t, const char *, ...) throw ();
+extern "C" int __sprintf_chk (char *__restrict, int, size_t, const char *, ...) throw ();