Home | History | Annotate | Download | only in Headers
      1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c89 -ffreestanding %s
      2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c99 -ffreestanding %s
      3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s
      4 // expected-no-diagnostics
      5 
      6 /* Basic floating point conformance checks against:
      7     - N1570 draft of C11 Std.
      8     - N1256 draft of C99 Std.
      9     - http://port70.net/~nsz/c/c89/c89-draft.html draft of C89/C90 Std.
     10 */
     11 /*
     12     C11,    5.2.4.2.2p11,   pp. 30
     13     C99,    5.2.4.2.2p9,    pp. 25
     14     C89,    2.2.4.2
     15 */
     16 #include <float.h>
     17 
     18 #ifndef FLT_RADIX
     19     #error "Mandatory macro FLT_RADIX is missing."
     20 #elif   FLT_RADIX < 2
     21     #error "Mandatory macro FLT_RADIX is invalid."
     22 #endif
     23 
     24 
     25 #ifndef FLT_MANT_DIG
     26     #error "Mandatory macro FLT_MANT_DIG is missing."
     27 #elif   FLT_MANT_DIG < 2
     28     #error "Mandatory macro FLT_MANT_DIG is invalid."
     29 #endif
     30 #ifndef DBL_MANT_DIG
     31     #error "Mandatory macro DBL_MANT_DIG is missing."
     32 #elif   DBL_MANT_DIG < 2
     33     #error "Mandatory macro DBL_MANT_DIG is invalid."
     34 #endif
     35 #ifndef LDBL_MANT_DIG
     36     #error "Mandatory macro LDBL_MANT_DIG is missing."
     37 #elif   LDBL_MANT_DIG < 2
     38     #error "Mandatory macro LDBL_MANT_DIG is invalid."
     39 #endif
     40 #if ((FLT_MANT_DIG > DBL_MANT_DIG) || (DBL_MANT_DIG > LDBL_MANT_DIG))
     41     #error "Mandatory macros {FLT,DBL,LDBL}_MANT_DIG are invalid."
     42 #endif
     43 
     44 
     45 #if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
     46     #ifndef FLT_DECIMAL_DIG
     47         #error "Mandatory macro FLT_DECIMAL_DIG is missing."
     48     #elif   FLT_DECIMAL_DIG < 6
     49         #error "Mandatory macro FLT_DECIMAL_DIG is invalid."
     50     #endif
     51     #ifndef DBL_DECIMAL_DIG
     52         #error "Mandatory macro DBL_DECIMAL_DIG is missing."
     53     #elif   DBL_DECIMAL_DIG < 10
     54         #error "Mandatory macro DBL_DECIMAL_DIG is invalid."
     55     #endif
     56     #ifndef LDBL_DECIMAL_DIG
     57         #error "Mandatory macro LDBL_DECIMAL_DIG is missing."
     58     #elif   LDBL_DECIMAL_DIG < 10
     59         #error "Mandatory macro LDBL_DECIMAL_DIG is invalid."
     60     #endif
     61     #if ((FLT_DECIMAL_DIG > DBL_DECIMAL_DIG) || (DBL_DECIMAL_DIG > LDBL_DECIMAL_DIG))
     62         #error "Mandatory macros {FLT,DBL,LDBL}_DECIMAL_DIG are invalid."
     63     #endif
     64 #else
     65     #ifdef FLT_DECIMAL_DIG
     66         #error "Macro FLT_DECIMAL_DIG should not be defined."
     67     #endif
     68     #ifdef DBL_DECIMAL_DIG
     69         #error "Macro DBL_DECIMAL_DIG should not be defined."
     70     #endif
     71     #ifdef LDBL_DECIMAL_DIG
     72         #error "Macro LDBL_DECIMAL_DIG should not be defined."
     73     #endif
     74 #endif
     75 
     76 
     77 #if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
     78     #ifndef DECIMAL_DIG
     79         #error "Mandatory macro DECIMAL_DIG is missing."
     80     #elif   DECIMAL_DIG < 10
     81         #error "Mandatory macro DECIMAL_DIG is invalid."
     82     #endif
     83 #else
     84     #ifdef DECIMAL_DIG
     85         #error "Macro DECIMAL_DIG should not be defined."
     86     #endif
     87 #endif
     88 
     89 
     90 #ifndef FLT_DIG
     91     #error "Mandatory macro FLT_DIG is missing."
     92 #elif   FLT_DIG < 6
     93     #error "Mandatory macro FLT_DIG is invalid."
     94 #endif
     95 #ifndef DBL_DIG
     96     #error "Mandatory macro DBL_DIG is missing."
     97 #elif   DBL_DIG < 10
     98     #error "Mandatory macro DBL_DIG is invalid."
     99 #endif
    100 #ifndef LDBL_DIG
    101     #error "Mandatory macro LDBL_DIG is missing."
    102 #elif   LDBL_DIG < 10
    103     #error "Mandatory macro LDBL_DIG is invalid."
    104 #endif
    105 #if ((FLT_DIG > DBL_DIG) || (DBL_DIG > LDBL_DIG))
    106     #error "Mandatory macros {FLT,DBL,LDBL}_DIG, are invalid."
    107 #endif
    108 
    109 
    110 #ifndef FLT_MIN_EXP
    111     #error "Mandatory macro FLT_MIN_EXP is missing."
    112 #elif   FLT_MIN_EXP > -1
    113     #error "Mandatory macro FLT_MIN_EXP is invalid."
    114 #endif
    115 #ifndef DBL_MIN_EXP
    116     #error "Mandatory macro DBL_MIN_EXP is missing."
    117 #elif   DBL_MIN_EXP > -1
    118     #error "Mandatory macro DBL_MIN_EXP is invalid."
    119 #endif
    120 #ifndef LDBL_MIN_EXP
    121     #error "Mandatory macro LDBL_MIN_EXP is missing."
    122 #elif   LDBL_MIN_EXP > -1
    123     #error "Mandatory macro LDBL_MIN_EXP is invalid."
    124 #endif
    125 
    126 
    127 #ifndef FLT_MIN_10_EXP
    128     #error "Mandatory macro FLT_MIN_10_EXP is missing."
    129 #elif   FLT_MIN_10_EXP > -37
    130     #error "Mandatory macro FLT_MIN_10_EXP is invalid."
    131 #endif
    132 #ifndef DBL_MIN_10_EXP
    133     #error "Mandatory macro DBL_MIN_10_EXP is missing."
    134 #elif   DBL_MIN_10_EXP > -37
    135     #error "Mandatory macro DBL_MIN_10_EXP is invalid."
    136 #endif
    137 #ifndef LDBL_MIN_10_EXP
    138     #error "Mandatory macro LDBL_MIN_10_EXP is missing."
    139 #elif   LDBL_MIN_10_EXP > -37
    140     #error "Mandatory macro LDBL_MIN_10_EXP is invalid."
    141 #endif
    142 
    143 
    144 #ifndef FLT_MAX_EXP
    145     #error "Mandatory macro FLT_MAX_EXP is missing."
    146 #elif   FLT_MAX_EXP < 1
    147     #error "Mandatory macro FLT_MAX_EXP is invalid."
    148 #endif
    149 #ifndef DBL_MAX_EXP
    150     #error "Mandatory macro DBL_MAX_EXP is missing."
    151 #elif   DBL_MAX_EXP < 1
    152     #error "Mandatory macro DBL_MAX_EXP is invalid."
    153 #endif
    154 #ifndef LDBL_MAX_EXP
    155     #error "Mandatory macro LDBL_MAX_EXP is missing."
    156 #elif   LDBL_MAX_EXP < 1
    157     #error "Mandatory macro LDBL_MAX_EXP is invalid."
    158 #endif
    159 #if ((FLT_MAX_EXP > DBL_MAX_EXP) || (DBL_MAX_EXP > LDBL_MAX_EXP))
    160     #error "Mandatory macros {FLT,DBL,LDBL}_MAX_EXP are invalid."
    161 #endif
    162 
    163 
    164 #ifndef FLT_MAX_10_EXP
    165     #error "Mandatory macro FLT_MAX_10_EXP is missing."
    166 #elif   FLT_MAX_10_EXP < 37
    167     #error "Mandatory macro FLT_MAX_10_EXP is invalid."
    168 #endif
    169 #ifndef DBL_MAX_10_EXP
    170     #error "Mandatory macro DBL_MAX_10_EXP is missing."
    171 #elif   DBL_MAX_10_EXP < 37
    172     #error "Mandatory macro DBL_MAX_10_EXP is invalid."
    173 #endif
    174 #ifndef LDBL_MAX_10_EXP
    175     #error "Mandatory macro LDBL_MAX_10_EXP is missing."
    176 #elif   LDBL_MAX_10_EXP < 37
    177     #error "Mandatory macro LDBL_MAX_10_EXP is invalid."
    178 #endif
    179 #if ((FLT_MAX_10_EXP > DBL_MAX_10_EXP) || (DBL_MAX_10_EXP > LDBL_MAX_10_EXP))
    180     #error "Mandatory macros {FLT,DBL,LDBL}_MAX_10_EXP are invalid."
    181 #endif
    182 
    183 
    184 /* Internal consistency checks */
    185 _Static_assert(FLT_RADIX == __FLT_RADIX__, "");
    186 
    187 _Static_assert(FLT_MANT_DIG == __FLT_MANT_DIG__, "");
    188 _Static_assert(DBL_MANT_DIG == __DBL_MANT_DIG__, "");
    189 _Static_assert(LDBL_MANT_DIG == __LDBL_MANT_DIG__, "");
    190 
    191 #if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
    192 _Static_assert(FLT_DECIMAL_DIG == __FLT_DECIMAL_DIG__, "");
    193 _Static_assert(DBL_DECIMAL_DIG == __DBL_DECIMAL_DIG__, "");
    194 _Static_assert(LDBL_DECIMAL_DIG == __LDBL_DECIMAL_DIG__, "");
    195 #endif
    196 
    197 #if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
    198 _Static_assert(DECIMAL_DIG == __DECIMAL_DIG__, "");
    199 #endif
    200 
    201 _Static_assert(FLT_DIG == __FLT_DIG__, "");
    202 _Static_assert(DBL_DIG == __DBL_DIG__, "");
    203 _Static_assert(LDBL_DIG == __LDBL_DIG__, "");
    204 
    205 _Static_assert(FLT_MIN_EXP == __FLT_MIN_EXP__, "");
    206 _Static_assert(DBL_MIN_EXP == __DBL_MIN_EXP__, "");
    207 _Static_assert(LDBL_MIN_EXP == __LDBL_MIN_EXP__, "");
    208 
    209 _Static_assert(FLT_MIN_10_EXP == __FLT_MIN_10_EXP__, "");
    210 _Static_assert(DBL_MIN_10_EXP == __DBL_MIN_10_EXP__, "");
    211 _Static_assert(LDBL_MIN_10_EXP == __LDBL_MIN_10_EXP__, "");
    212 
    213 _Static_assert(FLT_MAX_EXP == __FLT_MAX_EXP__, "");
    214 _Static_assert(DBL_MAX_EXP == __DBL_MAX_EXP__, "");
    215 _Static_assert(LDBL_MAX_EXP == __LDBL_MAX_EXP__, "");
    216 
    217 _Static_assert(FLT_MAX_10_EXP == __FLT_MAX_10_EXP__, "");
    218 _Static_assert(DBL_MAX_10_EXP == __DBL_MAX_10_EXP__, "");
    219 _Static_assert(LDBL_MAX_10_EXP == __LDBL_MAX_10_EXP__, "");
    220