https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14505
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Returning 1 for addresses of objects is highly undesirable. Not only it isn't really constant on many targets or with many options (e.g. in shared libraries, or PIE executables), but even in position dependent code you don't know the address at compile time, only at link time. And, as we don't return 1 for any object addresses, so why should __func__ be an exception? Try: int foo () { static int a; static const int b = 3; static const char c[3] = "ab"; static const char *d = "cd"; static const char *const e = "ef"; return 1 * __builtin_constant_p (&a) + 2 * __builtin_constant_p (&b) + 4 *__builtin_constant_p (c) + 8 * __builtin_constant_p (c[0]) + 16 *__builtin_constant_p (d) + 32 * __builtin_constant_p (d[0]) + 64 *__builtin_constant_p (e) + 128 * __builtin_constant_p (e[0]); } The returned value is 8 + 32 + 128, which is IMHO right, what is really constant are the individual characters of the string literals. So, if you want to test whether __func__ is constant, you should test whether e.g. __func__[0] is __builtin_constant_p, the address of that can be anything and is not known at compile time.