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