Gianluigi Tiesi wrote:

> On 26/03/2012 7.33, Jim Meyering wrote:
>> Gianluigi Tiesi wrote:
>>> On 25/03/2012 6.58, Paul Eggert wrote:
>>>> On 03/24/2012 09:28 PM, Gianluigi Tiesi wrote:
>>>>> While compiling regex module one android I've discovered a problem
>>>>> that on other 32bit compiler is only a warning
>>>>>
>>>>> ...
>>>>> it's correct, but I think an ifdef may be used instead since
>>>>> BITSET_WORD_BITS is a define
>>>>
>>>>
>>>> Generally speaking we prefer 'if (xxx)' to '#if xxx' where either will
>>>> do, because the former is easier to read and reason about. If the only
>>>> problem with 'if (xxx)' is a bogus warning by some random compiler then
>>>> it's probably better to leave it alone (and get the compiler fixed....).
>>>
>>> I don't think assigning a 64bit integer constant in a 32bit variable
>>> type is a bogus warning,
>>
>> It is bogus in this case because your compiler is warning
>> about what is called dead code: code that it can determine
>> will never be executed.
>
> hmm, if gcc is unable to detect dead code, this does not make legit
> everything in the dead code.
>
>>
>>> and some software using gnulib like parted
>>> enable Werror by default

No package should be forcing you to use -Werror.

>> Gnu parted does not enable -Werror by default.
>> However, it is enabled if you configure with --enable-gcc-warnings.
>
> gnu parted 2.4 enables by default -Werror, you can configure it with
> --enable-Werror=no, git version (3.1) removed at all the option and the

I know.  I removed that code 8 months ago, before parted-3.0.

> flag. But I still don't understand why use dead code instead of ifdef
> if the compiler is unable to detect it.

Paul already explained above: it is more readable.
It doesn't warn for us because we use more recent compilers.

> I've tested with gcc 4.4.3
> (android ndk) and 4.6.2 (mingw), both warns.
> I'm not really sure even if it warns that the code is compiled in the 
> executable.
>
> I've just tested the code:
>
> #include <stdio.h>
> #include <stdlib.h>
> #define A 64
> //#define A 32
>
> int main(void)
> {
>     int a = 0;
>     if (A == 32)
>         a = ((unsigned long long) (-1));
>     if (a)
>         printf("%d\n", a);
>     return 0;
> }
>
> it warns about an overflow, but if variable a is not initialized, it says it 
> is used uninitialized (not maybe used)
>
> a.c: In function 'main':
> a.c:10:9: warning: overflow in implicit constant conversion [-Woverflow]
> a.c:11:8: warning: 'a' is used uninitialized in this function 
> [-Wuninitialized]
>
> if you compile with -O2 and look at the asm the printf is removed,
> but you still have a warn.
>
> Ok I went a bit OT :) anyway it's uncommon for me to see if (DEFINE) else etc

We take attention to style/maintainability/readability further than most.

Reply via email to