wrong decltype( INTN_C(value) )?
Yaron Cohen-Tal
yaronct@gmail.com
Mon Mar 28 20:23:00 GMT 2016
Argh.. seems like the standard has indeed changed here. Too bad they
don't provide the official standard for free..
On Mon, Mar 28, 2016 at 10:37 PM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
>
> 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.
More information about the Libc-help
mailing list