This is the mail archive of the libc-help@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: wrong decltype( INTN_C(value) )?



On 28-03-2016 10:37, Yaron Cohen-Tal wrote:
> Where is this quote from? I couldn't find it in the C99 standard.

I do not know where you can find an 'official' C99 standard, but on
freely TS available [1] it is exactly where I referenced before
7.18.4 Macros for integer constants (page 260):

3 Each invocation of one of these macros shall expand to an integer constant expression
suitable for use in #if preprocessing directives. The type of the expression shall have
the same type as would an expression of the corresponding type converted according to
the integer promotions. The value of the expression shall be that of the argument.

The wording is the same in the standard copy I have.

[1] http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

> 
> On Mon, Mar 28, 2016 at 3:30 PM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>>
>> On 27-03-2016 17:54, Yaron Cohen-Tal wrote:
>>> Hi,
>>>
>>> I was wondering: according to the C99 standard (I couldn't get hold of
>>> the C11 standard) it seems like e.g. "INT8_C" should have the type
>>> "int_least8_t". From section 7.18.4.1:
>>>
>>> "The macro INTN_C(value) shall expand to a signed integer constant
>>> with the specified value and type int_leastN_t"
>>>
>>> However, on my system (Debian 8 x64) "INT8_C(1)" expands to "1" which
>>> has type "int" (which is 32 bit) whereas "int_least8_t" has type
>>> "signed char" (which is 8 bit). So is glibc not conformant to the
>>> standard here, or there's anything I misunderstand? I'd expact it to
>>> expand to "((signed char)1)".
>>>
>>
>> My understanding is it falls to:
>>
>> 7.18.4 Macros for integer constants
>>
>> 3. Each invocation of one of these macros shall expand to an integer
>>    constant expression suitable for use in #if preprocessing directives.
>>    The type of the expression shall have the same type as would an
>>    expression of the corresponding type *converted according to the
>>    integer promotions*. The value of the expression shall be that of
>>    the argument.
>>
>> Since it it should use default C99 integer promotions the macro should
>> not promote to smaller than int types.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]