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
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.
12 C11, 5.2.4.2.2p11, pp. 30
13 C99, 5.2.4.2.2p9, pp. 25
19 #error "Mandatory macro FLT_RADIX is missing."
21 #error "Mandatory macro FLT_RADIX is invalid."
26 #error "Mandatory macro FLT_MANT_DIG is missing."
27 #elif FLT_MANT_DIG < 2
28 #error "Mandatory macro FLT_MANT_DIG is invalid."
31 #error "Mandatory macro DBL_MANT_DIG is missing."
32 #elif DBL_MANT_DIG < 2
33 #error "Mandatory macro DBL_MANT_DIG is invalid."
36 #error "Mandatory macro LDBL_MANT_DIG is missing."
37 #elif LDBL_MANT_DIG < 2
38 #error "Mandatory macro LDBL_MANT_DIG is invalid."
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."
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."
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."
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."
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."
64 #ifndef FLT_HAS_SUBNORM
65 #error "Mandatory macro FLT_HAS_SUBNORM is missing."
66 #elif FLT_HAS_SUBNORM != __FLT_HAS_DENORM__
67 #error "Mandatory macro FLT_HAS_SUBNORM is invalid."
69 #ifndef LDBL_HAS_SUBNORM
70 #error "Mandatory macro LDBL_HAS_SUBNORM is missing."
71 #elif LDBL_HAS_SUBNORM != __LDBL_HAS_DENORM__
72 #error "Mandatory macro LDBL_HAS_SUBNORM is invalid."
74 #ifndef DBL_HAS_SUBNORM
75 #error "Mandatory macro DBL_HAS_SUBNORM is missing."
76 #elif DBL_HAS_SUBNORM != __DBL_HAS_DENORM__
77 #error "Mandatory macro DBL_HAS_SUBNORM is invalid."
80 #ifdef FLT_DECIMAL_DIG
81 #error "Macro FLT_DECIMAL_DIG should not be defined."
83 #ifdef DBL_DECIMAL_DIG
84 #error "Macro DBL_DECIMAL_DIG should not be defined."
86 #ifdef LDBL_DECIMAL_DIG
87 #error "Macro LDBL_DECIMAL_DIG should not be defined."
89 #ifdef FLT_HAS_SUBNORM
90 #error "Macro FLT_HAS_SUBNORM should not be defined."
92 #ifdef DBL_HAS_SUBNORM
93 #error "Macro DBL_HAS_SUBNORM should not be defined."
95 #ifdef LDBL_HAS_SUBNORM
96 #error "Macro LDBL_HAS_SUBNORM should not be defined."
101 #if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
103 #error "Mandatory macro DECIMAL_DIG is missing."
104 #elif DECIMAL_DIG < 10
105 #error "Mandatory macro DECIMAL_DIG is invalid."
109 #error "Macro DECIMAL_DIG should not be defined."
115 #error "Mandatory macro FLT_DIG is missing."
117 #error "Mandatory macro FLT_DIG is invalid."
120 #error "Mandatory macro DBL_DIG is missing."
122 #error "Mandatory macro DBL_DIG is invalid."
125 #error "Mandatory macro LDBL_DIG is missing."
127 #error "Mandatory macro LDBL_DIG is invalid."
129 #if ((FLT_DIG > DBL_DIG) || (DBL_DIG > LDBL_DIG))
130 #error "Mandatory macros {FLT,DBL,LDBL}_DIG, are invalid."
135 #error "Mandatory macro FLT_MIN_EXP is missing."
136 #elif FLT_MIN_EXP > -1
137 #error "Mandatory macro FLT_MIN_EXP is invalid."
140 #error "Mandatory macro DBL_MIN_EXP is missing."
141 #elif DBL_MIN_EXP > -1
142 #error "Mandatory macro DBL_MIN_EXP is invalid."
145 #error "Mandatory macro LDBL_MIN_EXP is missing."
146 #elif LDBL_MIN_EXP > -1
147 #error "Mandatory macro LDBL_MIN_EXP is invalid."
151 #ifndef FLT_MIN_10_EXP
152 #error "Mandatory macro FLT_MIN_10_EXP is missing."
153 #elif FLT_MIN_10_EXP > -37
154 #error "Mandatory macro FLT_MIN_10_EXP is invalid."
156 #ifndef DBL_MIN_10_EXP
157 #error "Mandatory macro DBL_MIN_10_EXP is missing."
158 #elif DBL_MIN_10_EXP > -37
159 #error "Mandatory macro DBL_MIN_10_EXP is invalid."
161 #ifndef LDBL_MIN_10_EXP
162 #error "Mandatory macro LDBL_MIN_10_EXP is missing."
163 #elif LDBL_MIN_10_EXP > -37
164 #error "Mandatory macro LDBL_MIN_10_EXP is invalid."
169 #error "Mandatory macro FLT_MAX_EXP is missing."
170 #elif FLT_MAX_EXP < 1
171 #error "Mandatory macro FLT_MAX_EXP is invalid."
174 #error "Mandatory macro DBL_MAX_EXP is missing."
175 #elif DBL_MAX_EXP < 1
176 #error "Mandatory macro DBL_MAX_EXP is invalid."
179 #error "Mandatory macro LDBL_MAX_EXP is missing."
180 #elif LDBL_MAX_EXP < 1
181 #error "Mandatory macro LDBL_MAX_EXP is invalid."
183 #if ((FLT_MAX_EXP > DBL_MAX_EXP) || (DBL_MAX_EXP > LDBL_MAX_EXP))
184 #error "Mandatory macros {FLT,DBL,LDBL}_MAX_EXP are invalid."
188 #ifndef FLT_MAX_10_EXP
189 #error "Mandatory macro FLT_MAX_10_EXP is missing."
190 #elif FLT_MAX_10_EXP < 37
191 #error "Mandatory macro FLT_MAX_10_EXP is invalid."
193 #ifndef DBL_MAX_10_EXP
194 #error "Mandatory macro DBL_MAX_10_EXP is missing."
195 #elif DBL_MAX_10_EXP < 37
196 #error "Mandatory macro DBL_MAX_10_EXP is invalid."
198 #ifndef LDBL_MAX_10_EXP
199 #error "Mandatory macro LDBL_MAX_10_EXP is missing."
200 #elif LDBL_MAX_10_EXP < 37
201 #error "Mandatory macro LDBL_MAX_10_EXP is invalid."
203 #if ((FLT_MAX_10_EXP > DBL_MAX_10_EXP) || (DBL_MAX_10_EXP > LDBL_MAX_10_EXP))
204 #error "Mandatory macros {FLT,DBL,LDBL}_MAX_10_EXP are invalid."
208 /* Internal consistency checks */
209 _Static_assert(FLT_RADIX == __FLT_RADIX__, "");
211 _Static_assert(FLT_MANT_DIG == __FLT_MANT_DIG__, "");
212 _Static_assert(DBL_MANT_DIG == __DBL_MANT_DIG__, "");
213 _Static_assert(LDBL_MANT_DIG == __LDBL_MANT_DIG__, "");
215 #if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
216 _Static_assert(FLT_DECIMAL_DIG == __FLT_DECIMAL_DIG__, "");
217 _Static_assert(DBL_DECIMAL_DIG == __DBL_DECIMAL_DIG__, "");
218 _Static_assert(LDBL_DECIMAL_DIG == __LDBL_DECIMAL_DIG__, "");
221 #if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
222 _Static_assert(DECIMAL_DIG == __DECIMAL_DIG__, "");
225 _Static_assert(FLT_DIG == __FLT_DIG__, "");
226 _Static_assert(DBL_DIG == __DBL_DIG__, "");
227 _Static_assert(LDBL_DIG == __LDBL_DIG__, "");
229 _Static_assert(FLT_MIN_EXP == __FLT_MIN_EXP__, "");
230 _Static_assert(DBL_MIN_EXP == __DBL_MIN_EXP__, "");
231 _Static_assert(LDBL_MIN_EXP == __LDBL_MIN_EXP__, "");
233 _Static_assert(FLT_MIN_10_EXP == __FLT_MIN_10_EXP__, "");
234 _Static_assert(DBL_MIN_10_EXP == __DBL_MIN_10_EXP__, "");
235 _Static_assert(LDBL_MIN_10_EXP == __LDBL_MIN_10_EXP__, "");
237 _Static_assert(FLT_MAX_EXP == __FLT_MAX_EXP__, "");
238 _Static_assert(DBL_MAX_EXP == __DBL_MAX_EXP__, "");
239 _Static_assert(LDBL_MAX_EXP == __LDBL_MAX_EXP__, "");
241 _Static_assert(FLT_MAX_10_EXP == __FLT_MAX_10_EXP__, "");
242 _Static_assert(DBL_MAX_10_EXP == __DBL_MAX_10_EXP__, "");
243 _Static_assert(LDBL_MAX_10_EXP == __LDBL_MAX_10_EXP__, "");