2007-09-06 Jakub Jelinek PR c++/33289 * decl.c (builtin_function_1): Set DECL_ANTICIPATED also on __*_chk non-__builtin_* decls. * g++.dg/eh/builtin4.C: New test. --- gcc/cp/decl.c.jj 2007-08-31 14:28:19.000000000 +0200 +++ gcc/cp/decl.c 2007-09-04 21:28:06.000000000 +0200 @@ -3517,6 +3529,17 @@ builtin_function_1 (tree decl, tree cont 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; } --- gcc/testsuite/g++.dg/eh/builtin4.C.jj 2007-09-04 22:06:06.000000000 +0200 +++ gcc/testsuite/g++.dg/eh/builtin4.C 2007-09-04 22:07:03.000000000 +0200 @@ -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 ();