Here is a revised test, which I renamed to c11-5_2_4_2_2p11.c instead
of float.c because I am only checking a subset of what the standard
mandates for float.h, and because there were similar precedents, like
test/Preprocessor/c99-*.c. Feel free to override, though.

The first part checks for basic compliance with the referred C11
paragraph, the second for internal consistency between the underscored
and exposed versions of the macros.
No attempt was made to support C99 or C89.

I am not very clear on the proper use of the whole lit.py / RUN
framework, so someone should really confirm if what I wrote is
correct. The goal was to test both hosted and freestanding
implementations with C11, and expect no diagnostics from either.

Thanks for the help,

JT

On Tue, Feb 9, 2016 at 5:56 PM, Richard Smith <rich...@metafoo.co.uk> wrote:
> On Tue, Feb 9, 2016 at 2:43 PM, Jorge Teixeira
> <j.lopes.teixe...@gmail.com> wrote:
>> Richard,
>>
>> Can you be more specific?
>>
>> I assume you mean something like my newly attached .h file that tests
>> very basic implementation compliance (i.e., it's required, but not
>> sufficient), but I would need a bit more guidance about the structure
>> of the file, how to perform the tests, and where to exactly place and
>> name the file within test/Headers.
>>
>> I some sort of template exists, or if someone else takes point and
>> makes it, I can "port" the attached p11 test cases. I am unsure of how
>> to perform a more normative compliance - for example, to assert that
>> LDBL_DECIMAL_DIG is 21 on x86-64 and that indeed those many digits are
>> guaranteed to be correct, etc. This is probably not possible / does
>> not make sense.
>
> That looks like a decent basic test for this. The test should be named
> something like test/Headers/float.c, and needs to contain a "RUN:"
> line so that the test runner infrastructure knows how to run it. You
> can look at test/Header/limits.cpp for an example of how this works.
>
> We already have platform-specific tests that __LDBL_DECIMAL_DIG__ is
> the right value, so you could test the values are correct by checking
> that LDBL_DECIMAL_DIG == __LDBL_DECIMAL_DIG__.
>
>> JT
>>
>> On Tue, Feb 9, 2016 at 3:58 PM, Richard Smith <rich...@metafoo.co.uk> wrote:
>>> Patch looks good. Please also add a testcase to test/Headers.
>>>
>>> On Tue, Feb 9, 2016 at 12:08 PM, Hubert Tong via cfe-commits
>>> <cfe-commits@lists.llvm.org> wrote:
>>>> I see no immediate issue with this patch, but I am not one of the usual
>>>> reviewers for this part of the code base.
>>>>
>>>> -- HT
>>>>
>>>>
>>>> On Tue, Feb 9, 2016 at 2:56 PM, Jorge Teixeira <j.lopes.teixe...@gmail.com>
>>>> wrote:
>>>>>
>>>>> Thanks Hubert. Somehow I omitted that prefix when typing the macros,
>>>>> and I did not noticed it when I was testing because on my arch
>>>>> DECIMAL_DIG is defined to be the LDBL version...
>>>>>
>>>>> Updated patch is attached.
>>>>>
>>>>> JT
>>>>>
>>>>> On Tue, Feb 9, 2016 at 1:41 PM, Hubert Tong
>>>>> <hubert.reinterpretc...@gmail.com> wrote:
>>>>> > There is a __LDBL_DECIMAL_DIG__ predefined macro. __DECIMAL_DIG__ will
>>>>> > not
>>>>> > always be the same as __LDBL_DECIMAL_DIG__.
>>>>> >
>>>>> > -- HT
>>>>> >
>>>>> > On Mon, Feb 8, 2016 at 11:26 PM, Jorge Teixeira via cfe-commits
>>>>> > <cfe-commits@lists.llvm.org> wrote:
>>>>> >>
>>>>> >> Hi, I filed the bug (https://llvm.org/bugs/show_bug.cgi?id=26283) some
>>>>> >> time ago and nobody picked it up, so here is a trivial patch exposing
>>>>> >> the missing macros, that to the best of my ability were already
>>>>> >> present as the internal underscored versions.
>>>>> >>
>>>>> >> Perhaps a more general bug about C11 floating point (lack of)
>>>>> >> conformance should be filed, so that some form of unit test/macro
>>>>> >> validation could be worked on, but this patch does scratch my current
>>>>> >> itch.
>>>>> >>
>>>>> >> Successfully tested on x86-64 Xubuntu 14.04 with clang 3.8 from the
>>>>> >> ppa, patched with the attached diff.
>>>>> >>
>>>>> >> First contribution, so feel free to suggest improvements or point to
>>>>> >> more detailed step-by-step instructions/guidelines.
>>>>> >>
>>>>> >> Cheers,
>>>>> >>
>>>>> >> JT
>>>>> >>
>>>>> >> _______________________________________________
>>>>> >> cfe-commits mailing list
>>>>> >> cfe-commits@lists.llvm.org
>>>>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>> >>
>>>>> >
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> cfe-commits mailing list
>>>> cfe-commits@lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
// RUN: %clang_cc1 -fsyntax-only -verify -std=c11 %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s
// expected-no-diagnostics

/* Basic conformance checks against the N1570 draft of C11 Std. */
/*
    5.2.4.2.2p11, pp. 30
*/
#include <float.h>
#if ((__STDC_VERSION__ >= 201112L) || !defined(__STRICT_ANSI__))

#ifndef FLT_RADIX
    #error "Mandatory macro FLT_RADIX is missing."
#elif   FLT_RADIX < 2
    #error "Mandatory macro FLT_RADIX is invalid."
#endif


#ifndef FLT_MANT_DIG
    #error "Mandatory macro FLT_MANT_DIG is missing."
#elif   FLT_MANT_DIG < 1
    #error "Mandatory macro FLT_MANT_DIG is invalid."
#endif
#ifndef DBL_MANT_DIG
    #error "Mandatory macro DBL_MANT_DIG is missing."
#elif   DBL_MANT_DIG < 1
    #error "Mandatory macro DBL_MANT_DIG is invalid."
#endif
#ifndef LDBL_MANT_DIG
    #error "Mandatory macro LDBL_MANT_DIG is missing."
#elif   LDBL_MANT_DIG < 1
    #error "Mandatory macro LDBL_MANT_DIG is invalid."
#endif
#if ((FLT_MANT_DIG > DBL_MANT_DIG) || (DBL_MANT_DIG > LDBL_MANT_DIG))
    #error "Mandatory macros {FLT,DBL,LDBL}_MANT_DIG are invalid."
#endif


#ifndef FLT_DECIMAL_DIG
    #error "Mandatory macro FLT_DECIMAL_DIG is missing."
#elif   FLT_DECIMAL_DIG < 6
    #error "Mandatory macro FLT_DECIMAL_DIG is invalid."
#endif
#ifndef DBL_DECIMAL_DIG
    #error "Mandatory macro DBL_DECIMAL_DIG is missing."
#elif   DBL_DECIMAL_DIG < 10
    #error "Mandatory macro DBL_DECIMAL_DIG is invalid."
#endif
#ifndef LDBL_DECIMAL_DIG
    #error "Mandatory macro LDBL_DECIMAL_DIG is missing."
#elif   LDBL_DECIMAL_DIG < 10
    #error "Mandatory macro LDBL_DECIMAL_DIG is invalid."
#endif
#if ((FLT_DECIMAL_DIG > DBL_DECIMAL_DIG) || (DBL_DECIMAL_DIG > LDBL_DECIMAL_DIG))
    #error "Mandatory macros {FLT,DBL,LDBL}_DECIMAL_DIG are invalid."
#endif


#ifndef DECIMAL_DIG
    #error "Mandatory macro DECIMAL_DIG is missing."
#elif   DECIMAL_DIG < 10
    #error "Mandatory macro DECIMAL_DIG is invalid."
#endif


#ifndef FLT_DIG
    #error "Mandatory macro FLT_DIG is missing."
#elif   FLT_DIG < 6
    #error "Mandatory macro FLT_DIG is invalid."
#endif
#ifndef DBL_DIG
    #error "Mandatory macro DBL_DIG is missing."
#elif   DBL_DIG < 10
    #error "Mandatory macro DBL_DIG is invalid."
#endif
#ifndef LDBL_DIG
    #error "Mandatory macro LDBL_DIG is missing."
#elif   LDBL_DIG < 10
    #error "Mandatory macro LDBL_DIG is invalid."
#endif
#if ((FLT_DIG > DBL_DIG) || (DBL_DIG > LDBL_DIG))
    #error "Mandatory macros {FLT,DBL,LDBL}_DIG, are invalid."
#endif


#ifndef FLT_MIN_EXP
    #error "Mandatory macro _MIN_EXP is missing."
#elif   FLT_MIN_EXP > -2
    #error "Mandatory macro _MIN_EXP is invalid."
#endif
#ifndef DBL_MIN_EXP
    #error "Mandatory macro DBL_MIN_EXP is missing."
#elif   DBL_MIN_EXP > -2
    #error "Mandatory macro DBL_MIN_EXP is invalid."
#endif
#ifndef LDBL_MIN_EXP
    #error "Mandatory macro LDBL_MIN_EXP is missing."
#elif   LDBL_MIN_EXP > -2
    #error "Mandatory macro LDBL_MIN_EXP is invalid."
#endif
#if ((FLT_MIN_EXP < DBL_MIN_EXP) || (DBL_MIN_EXP < LDBL_MIN_EXP))
    #error "Mandatory macros {FLT,DBL,LDBL}_MIN_EXP are invalid."
#endif


#ifndef FLT_MIN_10_EXP
    #error "Mandatory macro FLT_MIN_10_EXP is missing."
#elif   FLT_MIN_10_EXP > -37
    #error "Mandatory macro FLT_MIN_10_EXP is invalid."
#endif
#ifndef DBL_MIN_10_EXP
    #error "Mandatory macro DBL_MIN_10_EXP is missing."
#elif   DBL_MIN_10_EXP > -37
    #error "Mandatory macro DBL_MIN_10_EXP is invalid."
#endif
#ifndef LDBL_MIN_10_EXP
    #error "Mandatory macro LDBL_MIN_10_EXP is missing."
#elif   LDBL_MIN_10_EXP > -37
    #error "Mandatory macro LDBL_MIN_10_EXP is invalid."
#endif
#if ((FLT_MIN_10_EXP < DBL_MIN_10_EXP) || (DBL_MIN_10_EXP < LDBL_MIN_10_EXP))
    #error "Mandatory macros {FLT,DBL,LDBL}_MIN_10_EXP are invalid."
#endif


#ifndef FLT_MAX_EXP
    #error "Mandatory macro FLT_MAX_EXP is missing."
#elif   FLT_MAX_EXP < 2
    #error "Mandatory macro FLT_MAX_EXP is invalid."
#endif
#ifndef DBL_MAX_EXP
    #error "Mandatory macro DBL_MAX_EXP is missing."
#elif   DBL_MAX_EXP < 2
    #error "Mandatory macro DBL_MAX_EXP is invalid."
#endif
#ifndef LDBL_MAX_EXP
    #error "Mandatory macro LDBL_MAX_EXP is missing."
#elif   LDBL_MAX_EXP < 2
    #error "Mandatory macro LDBL_MAX_EXP is invalid."
#endif
#if ((FLT_MAX_EXP > DBL_MAX_EXP) || (DBL_MAX_EXP > LDBL_MAX_EXP))
    #error "Mandatory macros {FLT,DBL,LDBL}_MAX_EXP are invalid."
#endif


#ifndef FLT_MAX_10_EXP
    #error "Mandatory macro FLT_MAX_10_EXP is missing."
#elif   FLT_MAX_10_EXP < 37
    #error "Mandatory macro FLT_MAX_10_EXP is invalid."
#endif
#ifndef DBL_MAX_10_EXP
    #error "Mandatory macro DBL_MAX_10_EXP is missing."
#elif   DBL_MAX_10_EXP < 37
    #error "Mandatory macro DBL_MAX_10_EXP is invalid."
#endif
#ifndef LDBL_MAX_10_EXP
    #error "Mandatory macro LDBL_MAX_10_EXP is missing."
#elif   LDBL_MAX_10_EXP < 37
    #error "Mandatory macro LDBL_MAX_10_EXP is invalid."
#endif
#if ((FLT_MAX_10_EXP > DBL_MAX_10_EXP) || (DBL_MAX_10_EXP > LDBL_MAX_10_EXP))
    #error "Mandatory macros {FLT,DBL,LDBL}_MAX_10_EXP are invalid."
#endif


/* Internal consistency checks */
_Static_assert(FLT_RADIX == __FLT_RADIX__, "");

_Static_assert(FLT_MANT_DIG == __FLT_MANT_DIG__, "");
_Static_assert(DBL_MANT_DIG == __DBL_MANT_DIG__, "");
_Static_assert(LDBL_MANT_DIG == __LDBL_MANT_DIG__, "");

_Static_assert(FLT_DECIMAL_DIG == __FLT_DECIMAL_DIG__, "");
_Static_assert(DBL_DECIMAL_DIG == __DBL_DECIMAL_DIG__, "");
_Static_assert(LDBL_DECIMAL_DIG == __LDBL_DECIMAL_DIG__, "");

_Static_assert(DECIMAL_DIG == __DECIMAL_DIG__, "");

_Static_assert(FLT_DIG == __FLT_DIG__, "");
_Static_assert(DBL_DIG == __DBL_DIG__, "");
_Static_assert(LDBL_DIG == __LDBL_DIG__, "");

_Static_assert(FLT_MIN_EXP == __FLT_MIN_EXP__, "");
_Static_assert(DBL_MIN_EXP == __DBL_MIN_EXP__, "");
_Static_assert(LDBL_MIN_EXP == __LDBL_MIN_EXP__, "");

_Static_assert(FLT_MIN_10_EXP == __FLT_MIN_10_EXP__, "");
_Static_assert(DBL_MIN_10_EXP == __DBL_MIN_10_EXP__, "");
_Static_assert(LDBL_MIN_10_EXP == __LDBL_MIN_10_EXP__, "");

_Static_assert(FLT_MAX_EXP == __FLT_MAX_EXP__, "");
_Static_assert(DBL_MAX_EXP == __DBL_MAX_EXP__, "");
_Static_assert(LDBL_MAX_EXP == __LDBL_MAX_EXP__, "");

_Static_assert(FLT_MAX_10_EXP == __FLT_MAX_10_EXP__, "");
_Static_assert(DBL_MAX_10_EXP == __DBL_MAX_10_EXP__, "");
_Static_assert(LDBL_MAX_10_EXP == __LDBL_MAX_10_EXP__, "");

#endif // __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to