Hi,

I decided to strike while the iron was hot and add the remaining tests
for float.h.

1) clang was missing the C11 mandatory *_HAS_SUBNORM macros, so I
added them. The internal underscored versions are *_HAS_DENORM, and
the Std. defines only "subnormal" and "unnormalized", so there could
be, in theory, a discrepancy. I tried to learn more about APfloat
supported types (IEEEsingle,PPCDoubleDouble,etc.) and how the
underscored macros are generated in
/lib/Preprocessor/InitPreprocessor.cpp, but it was inconclusive
whether *_HAS_DENORM was added to mean subnormal like C11 expects, or
not normalized. If the former, all is good, if the latter, my patch is
wrong and C11 compliance is not achieved - the solution would be to
study all supported fp implementations and add a new macro stating
only the subnormal capabilities.

2) FLT_EVAL_METHOD was only introduced in C99, so I changed float.h
and float.c to reflect that.

3) To help ensure that all macros were tested, I reordered them in
float.h and float.c to match the C11 section. This added a little
noise to this diff, but should be a one-off thing and simplify
maintenance if further tests or new macros are added in the future.

4) The tests for the remaining macros in float.h were added. I have
some reservations about the ones involving floating point literals
(*_MAX, *_EPSILON, *_MIN, *_TRUE_MIN) due to the conversions and
rounding among the types. Not sure how to improve them without making
assumptions and/or overcomplicating the test
(https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/).

5) There were no meaningful fp changes in the Technical Corrigenda for
C89, so the current tests (c89,c99,c11) should suffice. Not sure if
gnuxx modes are affected, but I don't expect them to define
__STRICT_ANSI__, so all macros should be exposed and tested
successfully.


Cheers,

JT

On Fri, Feb 12, 2016 at 2:32 PM, Hubert Tong
<hubert.reinterpretc...@gmail.com> wrote:
> Committed as r260710.
>
>
> On Fri, Feb 12, 2016 at 9:53 AM, Hubert Tong
> <hubert.reinterpretc...@gmail.com> wrote:
>>
>> Thanks Jorge. I'll work on committing this today.
>>
>> -- HT
>>
>> On Fri, Feb 12, 2016 at 12:10 AM, Jorge Teixeira
>> <j.lopes.teixe...@gmail.com> wrote:
>>>
>>> Hubert,
>>>
>>> Thanks for the code review. Over the weekend I'll try to learn a bit
>>> more about using Phabricator, but for now I'll reply here, and attach
>>> a new patch.
>>>
>>> a) *_MANT_DIG < 1 --> *_MANT_DIG < 2
>>> That is a stricter check and I agree with your rationale. Done.
>>>
>>> b) _MIN_EXP --> FLT_MIN_EXP
>>> Done.
>>>
>>> c) Remove _MIN_EXP and _MIN_10_EXP FLT,DBL,LDBL comparisons
>>> Yes, as you and Richard pointed out the added mantissa bits can
>>> compensate for the lack of increase of the exponent.
>>> Already fixed in http://reviews.llvm.org/rL260639.
>>>
>>> d) *_MAX_EXP and *_MIN_EXP 2,-2 --> 1,-1
>>> Done.
>>>
>>> Richard, will do re: single patch for multiple files. Also, can you
>>> close the bug report? Even if more tests for float.h get
>>> added/changed, the original problem has been solved.
>>>
>>> JT
>>>
>>>
>>> On Thu, Feb 11, 2016 at 8:38 PM, Hubert Tong
>>> <hubert.reinterpretc...@gmail.com> wrote:
>>> > Hi Jorge,
>>> >
>>> > I responded to the initial commit with some comments here:
>>> > http://reviews.llvm.org/rL260577
>>> >
>>> > -- HT
>>> >
>>> > On Thu, Feb 11, 2016 at 7:53 PM, Jorge Teixeira
>>> > <j.lopes.teixe...@gmail.com>
>>> > wrote:
>>> >>
>>> >> > You'll also need to change <float.h> to only provide DECIMAL_DIG in
>>> >> > C99
>>> >> > onwards.
>>> >> Done!
>>> >>
>>> >> > All of our -std versions are that standard plus applicable Defect
>>> >> > Reports. So -std=c89 includes TC1 and TC2, but not Amendment 1 (we
>>> >> > have -std=c94 for that, but the only difference from our C89 mode is
>>> >> > the addition of digraphs).
>>> >> I'll try to find the c89 TC2 and check if anything changed regarding
>>> >> these macros (unlikely).
>>> >>
>>> >> > __STRICT_ANSI__ is defined if Clang has not been asked to provide
>>> >> > extensions (either GNU extensions, perhaps via a flag like
>>> >> > -std=gnu99,
>>> >> > or MS extensions), and is used by C library headers to determine
>>> >> > that
>>> >> > they should provide a strictly-conforming set of declarations
>>> >> > without
>>> >> > extensions.
>>> >> Ok, so if !defined(__STRICT__ANSI__) clang should always expose "as
>>> >> much as possible", including stuff from later versions of the Std.
>>> >> and/or eventual extensions, just as it now on float.h and float.c,
>>> >> right?
>>> >>
>>> >> > Testing __STDC_VERSION__ for C94 makes sense if you're trying to
>>> >> > detect whether Amendment 1 features should be provided.
>>> >> Since this will affect only digraphs, I guess there is no need (for
>>> >> float.h, float.c).
>>> >>
>>> >> >> 3) Lastly, can you expand (...)
>>> >> >
>>> >> > No, it does not mean that.
>>> >> >
>>> >> > For PPC64, long double is (sometimes) modeled as a pair of doubles.
>>> >> > Under that model, the smallest normalized value for long double is
>>> >> > actually larger than the smallest normalized value for double
>>> >> > (remember that for a normalized value with exponent E, all numbers
>>> >> > of
>>> >> > the form 1.XXXXX * 2^E, with the right number of mantissa digits,
>>> >> > are
>>> >> > exactly representable, so increasing the number of mantissa bits
>>> >> > without changing the number of exponent bits increases the magnitude
>>> >> > of the smallest normalized positive number).
>>> >> >
>>> >> > The set of values of long double in this model *is* a superset of
>>> >> > the
>>> >> > set of values of double.
>>> >> >
>>> >> I see now, and removed the bogus tests. The patch should now test
>>> >> cleanly unless something needs DECIMAL_DIG but did not set the
>>> >> appropriate std. level, or defined __STRICT__ANSI__.
>>> >>
>>> >> Thanks for the learning experience,
>>> >>
>>> >> JT
>>> >>
>>> >>
>>> >>
>>> >> >> From /test/Preprocessor/init.cpp:
>>> >> >> // PPC64:#define __DBL_MIN_EXP__ (-1021)
>>> >> >> // PPC64:#define __FLT_MIN_EXP__ (-125)
>>> >> >> // PPC64:#define __LDBL_MIN_EXP__ (-968)
>>> >> >>
>>> >> >> This issue happened before
>>> >> >>
>>> >> >> (https://lists.gnu.org/archive/html/bug-gnulib/2011-08/msg00262.html,
>>> >> >> http://www.openwall.com/lists/musl/2013/11/15/1), but all it means
>>> >> >> is
>>> >> >> that ppc64 is not compliant with C without soft-float. The test is
>>> >> >> valid and should stay, and if someone tries to compile for ppc64 in
>>> >> >> c89, c99 or c11 modes, clang should 1) use soft float (bad idea),
>>> >> >> 2)
>>> >> >> issue a diagnostic saying that that arch cannot meet the desired C
>>> >> >> standard without a big performance penalty - the diag should be
>>> >> >> suppressible with some special cmd line argument.
>>> >> >> Thus, I added the tests back and the FAIL for PPC64 for the time
>>> >> >> being, with a comment. If you know of a way to skip only the
>>> >> >> specific
>>> >> >> *_MIN_EXP and *_MIN_10_EXP tests, please add it, because there
>>> >> >> might
>>> >> >> be more similar cases in the future.
>>> >> >>
>>> >> >> JT
>>> >> >>
>>> >> >> On Thu, Feb 11, 2016 at 3:04 PM, Richard Smith
>>> >> >> <rich...@metafoo.co.uk>
>>> >> >> wrote:
>>> >> >>> Thanks, I modified the test to also test C89 and C99 modes and
>>> >> >>> committed this as r260577.
>>> >> >>>
>>> >> >>> On Thu, Feb 11, 2016 at 11:29 AM, Jorge Teixeira
>>> >> >>> <j.lopes.teixe...@gmail.com> wrote:
>>> >> >>>> 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.
>>> >> >>>
>>> >> >>> test/Preprocessor/c99-* are an aberration. The goal would be that
>>> >> >>> this
>>> >> >>> test grows to cover all of the parts of float.h that we define, so
>>> >> >>> float.c seems like the appropriate name for it.
>>> >> >>>
>>> >> >>>> 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.
>>> >> >>>
>>> >> >>> We generally avoid testing hosted mode, because we don't want the
>>> >> >>> success of our tests to depend on the libc installed on the host
>>> >> >>> system.
>>> >> >>>
>>> >> >>>> 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
>>> >> >>>>>>>>
>>> >
>>> >
>>
>>
>
Index: lib/Headers/float.h
===================================================================
--- lib/Headers/float.h	(revision 260797)
+++ lib/Headers/float.h	(working copy)
@@ -33,12 +33,24 @@
 #  include_next <float.h>
 
 /* Undefine anything that we'll be redefining below. */
-#  undef FLT_EVAL_METHOD
 #  undef FLT_ROUNDS
+#  if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
+#    undef FLT_EVAL_METHOD
+#  endif
+#  if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+#    undef FLT_HAS_SUBNORM
+#    undef DBL_HAS_SUBNORM
+#    undef LDBL_HAS_SUBNORM
+#  endif
 #  undef FLT_RADIX
 #  undef FLT_MANT_DIG
 #  undef DBL_MANT_DIG
 #  undef LDBL_MANT_DIG
+#  if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+#    undef FLT_DECIMAL_DIG
+#    undef DBL_DECIMAL_DIG
+#    undef LDBL_DECIMAL_DIG
+#  endif
 #  if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
 #    undef DECIMAL_DIG
 #  endif
@@ -70,16 +82,22 @@
 #    undef FLT_TRUE_MIN
 #    undef DBL_TRUE_MIN
 #    undef LDBL_TRUE_MIN
-#    undef FLT_DECIMAL_DIG
-#    undef DBL_DECIMAL_DIG
-#    undef LDBL_DECIMAL_DIG
 #  endif
 #endif
 
-/* Characteristics of floating point types, C99 5.2.4.2.2 */
+/* Characteristics of floating point types, C11 5.2.4.2.2 */
+#define FLT_ROUNDS (__builtin_flt_rounds())
 
-#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
-#define FLT_ROUNDS (__builtin_flt_rounds())
+#if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
+#  define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
+#endif
+
+#if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+#  define FLT_HAS_SUBNORM __FLT_HAS_DENORM__
+#  define DBL_HAS_SUBNORM __DBL_HAS_DENORM__
+#  define LDBL_HAS_SUBNORM __LDBL_HAS_DENORM__
+#endif
+
 #define FLT_RADIX __FLT_RADIX__
 
 #define FLT_MANT_DIG __FLT_MANT_DIG__
@@ -86,6 +104,12 @@
 #define DBL_MANT_DIG __DBL_MANT_DIG__
 #define LDBL_MANT_DIG __LDBL_MANT_DIG__
 
+#if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+#  define FLT_DECIMAL_DIG __FLT_DECIMAL_DIG__
+#  define DBL_DECIMAL_DIG __DBL_DECIMAL_DIG__
+#  define LDBL_DECIMAL_DIG __LDBL_DECIMAL_DIG__
+#endif
+
 #if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
 #  define DECIMAL_DIG __DECIMAL_DIG__
 #endif
@@ -126,9 +150,6 @@
 #  define FLT_TRUE_MIN __FLT_DENORM_MIN__
 #  define DBL_TRUE_MIN __DBL_DENORM_MIN__
 #  define LDBL_TRUE_MIN __LDBL_DENORM_MIN__
-#  define FLT_DECIMAL_DIG __FLT_DECIMAL_DIG__
-#  define DBL_DECIMAL_DIG __DBL_DECIMAL_DIG__
-#  define LDBL_DECIMAL_DIG __LDBL_DECIMAL_DIG__
 #endif
 
 #endif /* __FLOAT_H */
Index: test/Headers/float.c
===================================================================
--- test/Headers/float.c	(revision 260797)
+++ test/Headers/float.c	(working copy)
@@ -9,12 +9,59 @@
     - http://port70.net/~nsz/c/c89/c89-draft.html draft of C89/C90 Std.
 */
 /*
-    C11,    5.2.4.2.2p11,   pp. 30
-    C99,    5.2.4.2.2p9,    pp. 25
-    C89,    2.2.4.2 
+    C11,    5.2.4.2.2,  pp. 28--33
+    C99,    5.2.4.2.2,  pp. 23--27
+    C89,    2.2.4.2
 */
 #include <float.h>
 
+#ifndef FLT_ROUNDS
+    #error "Mandatory macro FLT_ROUNDS is missing."
+#endif
+
+
+#if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
+    #ifndef FLT_EVAL_METHOD
+        #error "Mandatory macro FLT_EVAL_METHOD is missing."
+    #elif   FLT_EVAL_METHOD > 2
+        #error "Mandatory macro FLT_EVAL_METHOD is invalid."
+    #endif
+#else
+   #ifdef FLT_EVAL_METHOD
+        #error "Macro FLT_EVAL_METHOD should not be defined."
+    #endif
+#endif
+
+
+#if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+    #ifndef FLT_HAS_SUBNORM
+        #error "Mandatory macro FLT_HAS_SUBNORM is missing."
+    #elif   (FLT_HAS_SUBNORM < -1) || (FLT_HAS_SUBNORM > 1)
+        #error "Mandatory macro FLT_HAS_SUBNORM is invalid."
+    #endif
+    #ifndef DBL_HAS_SUBNORM
+        #error "Mandatory macro DBL_HAS_SUBNORM is missing."
+    #elif   (DBL_HAS_SUBNORM < -1) || (DBL_HAS_SUBNORM > 1)
+        #error "Mandatory macro DBL_HAS_SUBNORM is invalid."
+    #endif
+    #ifndef LDBL_HAS_SUBNORM
+        #error "Mandatory macro LDBL_HAS_SUBNORM is missing."
+    #elif   (LDBL_HAS_SUBNORM < -1) || (LDBL_HAS_SUBNORM > 1)
+        #error "Mandatory macro LDBL_HAS_SUBNORM is invalid."
+    #endif
+#else
+    #ifdef FLT_HAS_SUBNORM
+        #error "Macro FLT_HAS_SUBNORM should not be defined."
+    #endif
+    #ifdef DBL_HAS_SUBNORM
+        #error "Macro DBL_HAS_SUBNORM should not be defined."
+    #endif
+    #ifdef LDBL_HAS_SUBNORM
+        #error "Macro LDBL_HAS_SUBNORM should not be defined."
+    #endif
+#endif
+
+
 #ifndef FLT_RADIX
     #error "Mandatory macro FLT_RADIX is missing."
 #elif   FLT_RADIX < 2
@@ -181,7 +228,109 @@
 #endif
 
 
+#ifndef FLT_MAX
+    #error "Mandatory macro FLT_MAX is missing."
+#elif   FLT_MAX < 1E+37F
+    #error "Mandatory macro FLT_MAX is invalid."
+#endif
+#ifndef DBL_MAX
+    #error "Mandatory macro DBL_MAX is missing."
+#elif   DBL_MAX < 1E+37
+    #error "Mandatory macro DBL_MAX is invalid."
+#endif
+#ifndef LDBL_MAX
+    #error "Mandatory macro LDBL_MAX is missing."
+#elif   LDBL_MAX < 1E+37L
+    #error "Mandatory macro LDBL_MAX is invalid."
+#endif
+#if ((FLT_MAX > DBL_MAX) || (DBL_MAX > LDBL_MAX))
+    #error "Mandatory macros {FLT,DBL,LDBL}_MAX are invalid."
+#endif
+
+
+#ifndef FLT_EPSILON
+    #error "Mandatory macro FLT_EPSILON is missing."
+#elif   ((FLT_EPSILON > 1E-5F) || (FLT_EPSILON < 0.0F))
+    #error "Mandatory macro FLT_EPSILON is invalid."
+#endif
+#ifndef DBL_EPSILON
+    #error "Mandatory macro DBL_EPSILON is missing."
+#elif   ((DBL_EPSILON > 1E-9) || (DBL_EPSILON < 0.0))
+    #error "Mandatory macro DBL_EPSILON is invalid."
+#endif
+#ifndef LDBL_EPSILON
+    #error "Mandatory macro LDBL_EPSILON is missing."
+#elif   ((DBL_EPSILON > 1E-9L) || (DBL_EPSILON < 0.0L))
+    #error "Mandatory macro LDBL_EPSILON is invalid."
+#endif
+#if ((FLT_EPSILON < DBL_EPSILON) || (DBL_EPSILON < LDBL_EPSILON))
+    #error "Mandatory macros {FLT,DBL,LDBL}_EPSILON are invalid."
+#endif
+
+
+#ifndef FLT_MIN
+    #error "Mandatory macro FLT_MIN is missing."
+#elif   ((FLT_MIN > 1E-37F) || (FLT_MIN < 0.0F))
+    #error "Mandatory macro FLT_MIN is invalid."
+#endif
+#ifndef DBL_MIN
+    #error "Mandatory macro DBL_MIN is missing."
+#elif   ((DBL_MIN > 1E-37) || (DBL_MIN < 0.0))
+    #error "Mandatory macro DBL_MIN is invalid."
+#endif
+#ifndef LDBL_MIN
+    #error "Mandatory macro LDBL_MIN is missing."
+#elif   ((LDBL_MIN > 1E-37L) || (LDBL_MIN < 0.0L))
+    #error "Mandatory macro LDBL_MIN is invalid."
+#endif
+#if ((FLT_MIN < DBL_MIN) || (DBL_MIN < LDBL_MIN))
+    #error "Mandatory macros {FLT,DBL,LDBL}_MIN are invalid."
+#endif
+
+
+#if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+    #ifndef FLT_TRUE_MIN
+        #error "Mandatory macro FLT_TRUE_MIN is missing."
+    #elif   ((FLT_TRUE_MIN > 1E-37F) || (FLT_TRUE_MIN < 0.0F))
+        #error "Mandatory macro FLT_TRUE_MIN is invalid."
+    #endif
+    #ifndef DBL_TRUE_MIN
+        #error "Mandatory macro DBL_TRUE_MIN is missing."
+    #elif   ((DBL_TRUE_MIN > 1E-37) || (DBL_TRUE_MIN < 0.0))
+        #error "Mandatory macro DBL_TRUE_MIN is invalid."
+    #endif
+    #ifndef LDBL_TRUE_MIN
+        #error "Mandatory macro LDBL_TRUE_MIN is missing."
+    #elif   ((LDBL_TRUE_MIN > 1E-37L) || (LDBL_TRUE_MIN < 0.0L))
+        #error "Mandatory macro LDBL_TRUE_MIN is invalid."
+    #endif
+    #if ((FLT_TRUE_MIN < DBL_TRUE_MIN) || (DBL_TRUE_MIN < LDBL_TRUE_MIN))
+        #error "Mandatory macros {FLT,DBL,LDBL}_TRUE_MIN are invalid."
+    #endif
+#else
+    #ifdef FLT_TRUE_MIN
+        #error "Macro FLT_TRUE_MIN should not be defined."
+    #endif
+    #ifdef DBL_TRUE_MIN
+        #error "Macro DBL_TRUE_MIN should not be defined."
+    #endif
+    #ifdef LDBL_TRUE_MIN
+        #error "Macro LDBL_TRUE_MIN should not be defined."
+    #endif
+#endif
+
+
 /* Internal consistency checks */
+#if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
+_Static_assert(FLT_EVAL_METHOD == __FLT_EVAL_METHOD__, "");
+#endif
+
+#if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+_Static_assert(FLT_HAS_SUBNORM == __FLT_HAS_DENORM__, "");
+_Static_assert(DBL_HAS_SUBNORM == __DBL_HAS_DENORM__, "");
+_Static_assert(LDBL_HAS_SUBNORM == __LDBL_HAS_DENORM__, "");
+#endif
+
 _Static_assert(FLT_RADIX == __FLT_RADIX__, "");
 
 _Static_assert(FLT_MANT_DIG == __FLT_MANT_DIG__, "");
@@ -217,3 +366,21 @@
 _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__, "");
+
+_Static_assert(FLT_MAX == __FLT_MAX__, "");
+_Static_assert(DBL_MAX == __DBL_MAX__, "");
+_Static_assert(LDBL_MAX == __LDBL_MAX__, "");
+
+_Static_assert(FLT_EPSILON == __FLT_EPSILON__, "");
+_Static_assert(DBL_EPSILON == __DBL_EPSILON__, "");
+_Static_assert(LDBL_EPSILON == __LDBL_EPSILON__, "");
+
+_Static_assert(FLT_MIN == __FLT_MIN__, "");
+_Static_assert(DBL_MIN == __DBL_MIN__, "");
+_Static_assert(LDBL_MIN == __LDBL_MIN__, "");
+
+#if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+_Static_assert(FLT_TRUE_MIN == __FLT_DENORM_MIN__, "");
+_Static_assert(DBL_TRUE_MIN == __DBL_DENORM_MIN__, "");
+_Static_assert(LDBL_TRUE_MIN == __LDBL_DENORM_MIN__, "");
+#endif
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to