xref: /aosp_15_r20/external/clang/test/Headers/float.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
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