On Thu, Aug 31, 2017 at 02:08:07PM +0200, Otto Moerbeek wrote:
> Hi,
> 
> /usr/src/usr.sbin/sasyncd/carp.c:157:12: warning: comparison of
> unsigned enum expression < 0 is always false [-Wtautological-compare]
>         if (state < 0 || state > FAIL)
>             ~~~~~ ^ ~
> /usr/src/usr.sbin/sasyncd/carp.c:166:20: warning: comparison of
> unsigned enum expression < 0 is always false [-Wtautological-compare]
>         if (current_state < 0 || current_state > FAIL) {
>             ~~~~~~~~~~~~~ ^ ~
> 
> this warning is a tiny bit interesting. A compiler is free to choose
> the type of the enum, as long as it can represent all given values.
> So another compiler might choose not to make it unsigned. So I came up
> with this fix that is not depending on the signedness of the type. But
> most of the time avoiding enum is better, I suppose.

It's free to choose the integer type of the enum, but enumeration members
(i.e. the constant identifiers) have int type.

  The identifiers in an enumerator list are declared as constants that have
  type int and may appear wherever such are permitted.

  C11 (N1570) 6.7.2.2p3.

Furthermore, the defining expression of the constant must be representable
as an int. 6.7.2.2p2.

I've always vascillated about which operand to cast, and to which type, when
silencing compilers' annoying warnings. But now that I've read the section
more closely I think I'll just cast the operand with enum type to int, all
things being equal.

Reply via email to