Should GCC warn when __LINE__ is treated as %u %d %i?

Jonny Grant jg@jguk.org
Tue Feb 19 11:27:00 GMT 2019



On 18/02/2019 22:03, Martin Sebor wrote:
> On 2/17/19 7:12 AM, Jonny Grant wrote:
>> Hello
>>
>> **Please keep my email address in any replies.
>>
>>
>> 1) should this not give type conversion warnings?
>>
>> printf("lineoutput %d:%u:%i\n", __LINE__, __LINE__, __LINE__);
>>
>> 2) Should __LINE__ expand as an 'int', or 'unsigned int'?
>>
>> Had expected line 9 to expand as '9U', but -save-temps shows it ends 
>> up as:
>>
>> printf("lineoutput %d:%u:%i\n", 9, 9, 9);
> 
> The bigger problem with __LINE__ is that it need not expand to int
> at all, such as in the following:
> 
> $ cat u.c && gcc -O2 -S -Wall -Wextra u.c
> #line 2147483647
> 
> void f (void)
> {
>    __builtin_printf ("%i", __LINE__);
> }
> u.c: In function ‘f’:
> u.c:-2147483646:21: warning: format ‘%i’ expects argument of type ‘int’, 
> but argument 2 has type ‘long int’ [-Wformat=]
> 
> Notice how the line number in the message doesn't correspond to
> the sum of 2147483647 and 3 (the offset from the #line directive).
> 
> Martin

Good point. Looks like a compiler limitation. Although I wonder how many 
files really have that many lines, but anyway...

GCC could store the line number as a 'long int', then can display line 
numbers up to 2^63

u.c: In function ‘f’:
u.c:2147483650:21: warning: format ‘%i’ expects argument of type ‘int’, 
but argument 2 has type ‘long int’ [-Wformat=]

I can file a on gcc.gnu.org bugzilla, or would you prefer to file yourself?

Jonny



More information about the Gcc-help mailing list