blob: 46e9cc3fd9b03aff672413b80da7cb9c1924e03d [file] [log] [blame]
Richard Smithb473e1e2016-02-11 19:57:37 +00001// 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
Richard Smith66a73852016-02-12 01:15:33 +00006/* 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*/
Richard Smithb473e1e2016-02-11 19:57:37 +000011/*
Richard Smith66a73852016-02-12 01:15:33 +000012 C11, 5.2.4.2.2p11, pp. 30
13 C99, 5.2.4.2.2p9, pp. 25
14 C89, 2.2.4.2
Richard Smithb473e1e2016-02-11 19:57:37 +000015*/
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."
Hubert Tong14787012016-02-12 19:24:36 +000027#elif FLT_MANT_DIG < 2
Richard Smithb473e1e2016-02-11 19:57:37 +000028 #error "Mandatory macro FLT_MANT_DIG is invalid."
29#endif
30#ifndef DBL_MANT_DIG
31 #error "Mandatory macro DBL_MANT_DIG is missing."
Hubert Tong14787012016-02-12 19:24:36 +000032#elif DBL_MANT_DIG < 2
Richard Smithb473e1e2016-02-11 19:57:37 +000033 #error "Mandatory macro DBL_MANT_DIG is invalid."
34#endif
35#ifndef LDBL_MANT_DIG
36 #error "Mandatory macro LDBL_MANT_DIG is missing."
Hubert Tong14787012016-02-12 19:24:36 +000037#elif LDBL_MANT_DIG < 2
Richard Smithb473e1e2016-02-11 19:57:37 +000038 #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
Richard Smith66a73852016-02-12 01:15:33 +000077#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
Richard Smithb473e1e2016-02-11 19:57:37 +000087#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
Hubert Tong14787012016-02-12 19:24:36 +0000111 #error "Mandatory macro FLT_MIN_EXP is missing."
112#elif FLT_MIN_EXP > -1
113 #error "Mandatory macro FLT_MIN_EXP is invalid."
Richard Smithb473e1e2016-02-11 19:57:37 +0000114#endif
115#ifndef DBL_MIN_EXP
116 #error "Mandatory macro DBL_MIN_EXP is missing."
Hubert Tong14787012016-02-12 19:24:36 +0000117#elif DBL_MIN_EXP > -1
Richard Smithb473e1e2016-02-11 19:57:37 +0000118 #error "Mandatory macro DBL_MIN_EXP is invalid."
119#endif
120#ifndef LDBL_MIN_EXP
121 #error "Mandatory macro LDBL_MIN_EXP is missing."
Hubert Tong14787012016-02-12 19:24:36 +0000122#elif LDBL_MIN_EXP > -1
Richard Smithb473e1e2016-02-11 19:57:37 +0000123 #error "Mandatory macro LDBL_MIN_EXP is invalid."
124#endif
Richard Smithb473e1e2016-02-11 19:57:37 +0000125
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
Richard Smithb473e1e2016-02-11 19:57:37 +0000142
143
144#ifndef FLT_MAX_EXP
145 #error "Mandatory macro FLT_MAX_EXP is missing."
Hubert Tong14787012016-02-12 19:24:36 +0000146#elif FLT_MAX_EXP < 1
Richard Smithb473e1e2016-02-11 19:57:37 +0000147 #error "Mandatory macro FLT_MAX_EXP is invalid."
148#endif
149#ifndef DBL_MAX_EXP
150 #error "Mandatory macro DBL_MAX_EXP is missing."
Hubert Tong14787012016-02-12 19:24:36 +0000151#elif DBL_MAX_EXP < 1
Richard Smithb473e1e2016-02-11 19:57:37 +0000152 #error "Mandatory macro DBL_MAX_EXP is invalid."
153#endif
154#ifndef LDBL_MAX_EXP
155 #error "Mandatory macro LDBL_MAX_EXP is missing."
Hubert Tong14787012016-02-12 19:24:36 +0000156#elif LDBL_MAX_EXP < 1
Richard Smithb473e1e2016-02-11 19:57:37 +0000157 #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
Richard Smith66a73852016-02-12 01:15:33 +0000197#if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__)
Richard Smithb473e1e2016-02-11 19:57:37 +0000198_Static_assert(DECIMAL_DIG == __DECIMAL_DIG__, "");
Richard Smith66a73852016-02-12 01:15:33 +0000199#endif
Richard Smithb473e1e2016-02-11 19:57:37 +0000200
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__, "");