From 012c4da9f1989cb7227942559edddd57957733c1 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 6 Sep 2007 01:27:17 +0200 Subject: [PATCH] re PR c++/33289 (__sprintf_chk etc. not DECL_ANTICIPATED) 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 | 4 ++++ gcc/cp/decl.c | 11 +++++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/eh/builtin4.C | 6 ++++++ 4 files changed, 24 insertions(+) create mode 100644 gcc/testsuite/g++.dg/eh/builtin4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 07663ed10d3..b8fb9711721 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 PR c++/30302 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 311925a196d..9587de56848 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 41ca76ddc64..e6803a83f46 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 * 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 index 00000000000..32348174af6 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/builtin4.C @@ -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 (); -- 2.30.2