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