* 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.

Reply via email to