* Jakub Jelinek: > On Tue, Jul 02, 2024 at 12:54:09PM -0400, David Malcolm via Gcc wrote: >> Back in 2007 glibc gained some logic to implement "error" and >> "error_at_line" by splitting into zero and non-zero cases, with the >> nonzero case calling a "noreturn" function [1]. >> >> This doesn't seem to work. I tested back to 4.8.1 with Compiler >> Explorer [2], which seems to be the earliest GCC that supports -fdump- >> tree-original=stderr. >> >> What happens is that glibc's >> >> __extern_always_inline void >> error (int __status, int __errnum, const char *__format, ...) >> { >> if (__builtin_constant_p (__status) && __status != 0) >> __error_noreturn (__status, __errnum, __format, __va_arg_pack ()); >> else >> __error_alias (__status, __errnum, __format, __va_arg_pack ()); >> } >> >> comes out of GCC's C frontend as: >> >> { >> if (0) >> { >> __error_noreturn (__status, __errnum, __format, __builtin_va_arg_pack >> ()); >> } >> else >> { >> __error_alias (__status, __errnum, __format, __builtin_va_arg_pack ()); >> } >> } >> >> since __status is not a builtin constant, > > At -O0 sure, that is how __builtin_constant_p works. > The above is intended for optimized compilation, and I think it works just > fine then.
And it's generally needed with optimization only, to suppress warnings in unreachable code that only happen when optimization is turned on.