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