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