Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 May 2003 17:20:22 +0200
From:      Stefan Farfeleder <stefan@fafoe.dyndns.org>
To:        "Jacques A. Vidrine" <nectar@FreeBSD.org>
Cc:        Dag-Erling Smorgrav <des@ofug.org>
Subject:   Re: incorrect enum warning?
Message-ID:  <20030501152022.GC568@wombat.fafoe>
In-Reply-To: <20030501150713.GA34992@madman.celabo.org>
References:  <xzp7k9a67pf.fsf@flood.ping.uio.no> <20030501150713.GA34992@madman.celabo.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, May 01, 2003 at 10:07:13AM -0500, Jacques A. Vidrine wrote:
> On Thu, May 01, 2003 at 04:51:40PM +0200, Dag-Erling Smorgrav wrote:
> > Why does the following code in OpenPAM headers:
> > 
> > enum {
> >         PAM_SILENT                      = 0x80000000,

<...>

> > };
> > 
> > cause the following warning when compiled with CSTD=c99:
> > 
> > /usr/src/contrib/openpam/include/security/pam_constants.h:100: warning: ISO C restricts enumerator values to range of `int'
> > 
> > when 0x80000000 is clearly within the range of 'int' on all platforms
> > we support?
> 
> Guessing:
> C does not specify one's complement or two's complement representation
> of integers.  On a one's complement 32-bit platform, 0x80000000 is -0
> (negative zero), which cannot be an `int'.

6.4.4.1 Integer constants

<...>

The type of an integer constant is the first of the corresponding list
in which its value can be represented.

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

[This is for hexadecimal constants without suffix.]

Because 0x80000000 > INT_MAX on 32-Bit architectures, 0x80000000 has
type unsigned.  But enumeration constants always have type int, that's
why you're getting this warning.

Regards,
Stefan Farfeleder



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030501152022.GC568>