Clang Project

clang_source_code/test/Headers/float.c
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