Skip to content

Commit 0e7590a

Browse files
authored
[C23] Add *_NORM_MAX macros to <float.h> (#96643)
This adds the *_NORM_MAX macros to <float.h> for freestanding mode in Clang; the values were chosen based on the behavior seen coming from GCC and the values already produced for the *_MAX macros by Clang.
1 parent 4c03207 commit 0e7590a

File tree

6 files changed

+52
-2
lines changed

6 files changed

+52
-2
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,9 @@ C23 Feature Support
355355
- Clang now supports `N3017 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3017.htm>`_
356356
``#embed`` - a scannable, tooling-friendly binary resource inclusion mechanism.
357357

358+
- Added the ``FLT_NORM_MAX``, ``DBL_NORM_MAX``, and ``LDBL_NORM_MAX`` to the
359+
freestanding implementation of ``<float.h>`` that ships with Clang.
360+
358361
Non-comprehensive list of changes in this release
359362
-------------------------------------------------
360363

clang/lib/Frontend/InitPreprocessor.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal,
113113

114114
static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
115115
const llvm::fltSemantics *Sem, StringRef Ext) {
116-
const char *DenormMin, *Epsilon, *Max, *Min;
116+
const char *DenormMin, *NormMax, *Epsilon, *Max, *Min;
117+
NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38",
118+
"1.7976931348623157e+308", "1.18973149535723176502e+4932",
119+
"8.98846567431157953864652595394501e+307",
120+
"1.18973149535723176508575932662800702e+4932");
117121
DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45",
118122
"4.9406564584124654e-324", "3.64519953188247460253e-4951",
119123
"4.94065645841246544176568792868221e-324",
@@ -144,6 +148,7 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
144148
DefPrefix += "_";
145149

146150
Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext);
151+
Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext);
147152
Builder.defineMacro(DefPrefix + "HAS_DENORM__");
148153
Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits));
149154
Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits));

clang/lib/Headers/float.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@
8686
# undef DBL_HAS_SUBNORM
8787
# undef LDBL_HAS_SUBNORM
8888
# endif
89+
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \
90+
!defined(__STRICT_ANSI__)
91+
# undef FLT_NORM_MAX
92+
# undef DBL_NORM_MAX
93+
# undef LDBL_NORM_MAX
94+
#endif
8995
#endif
9096

9197
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \
@@ -166,6 +172,10 @@
166172
/* C23 5.2.5.3.3p29-30 */
167173
# define INFINITY (__builtin_inff())
168174
# define NAN (__builtin_nanf(""))
175+
/* C23 5.2.5.3.3p32 */
176+
# define FLT_NORM_MAX __FLT_NORM_MAX__
177+
# define DBL_NORM_MAX __DBL_NORM_MAX__
178+
# define LDBL_NORM_MAX __LDBL_NORM_MAX__
169179
#endif
170180

171181
#ifdef __STDC_WANT_IEC_60559_TYPES_EXT__

clang/test/Headers/float.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
// expected-no-diagnostics
1515

1616
/* Basic floating point conformance checks against:
17+
- C23 Final Std.
1718
- N1570 draft of C11 Std.
1819
- N1256 draft of C99 Std.
1920
- http://port70.net/~nsz/c/c89/c89-draft.html draft of C89/C90 Std.
2021
*/
2122
/*
23+
C23, 5.2.5.3.3p21, pp. 25
2224
C11, 5.2.4.2.2p11, pp. 30
2325
C99, 5.2.4.2.2p9, pp. 25
2426
C89, 2.2.4.2
@@ -225,6 +227,22 @@
225227
_Static_assert(_Generic(INFINITY, float : 1, default : 0), ""); // finite-warning {{use of infinity via a macro is undefined behavior due to the currently enabled floating-point options}}
226228
_Static_assert(_Generic(NAN, float : 1, default : 0), ""); // finite-warning {{use of NaN is undefined behavior due to the currently enabled floating-point options}} \
227229
finite-warning {{use of NaN via a macro is undefined behavior due to the currently enabled floating-point options}}
230+
231+
#ifndef FLT_NORM_MAX
232+
#error "Mandatory macro FLT_NORM_MAX is missing."
233+
#else
234+
_Static_assert(FLT_NORM_MAX >= 1.0E+37F, "Mandatory macro FLT_NORM_MAX is invalid.");
235+
#endif
236+
#ifndef DBL_NORM_MAX
237+
#error "Mandatory macro DBL_NORM_MAX is missing."
238+
#else
239+
_Static_assert(DBL_NORM_MAX >= 1.0E+37, "Mandatory macro DBL_NORM_MAX is invalid.");
240+
#endif
241+
#ifndef LDBL_NORM_MAX
242+
#error "Mandatory macro LDBL_NORM_MAX is missing."
243+
#else
244+
_Static_assert(LDBL_NORM_MAX >= 1.0E+37L, "Mandatory macro LDBL_NORM_MAX is invalid.");
245+
#endif
228246
#else
229247
#ifdef INFINITY
230248
#error "Macro INFINITY should not be defined."
@@ -271,8 +289,14 @@ _Static_assert(FLT_MAX_10_EXP == __FLT_MAX_10_EXP__, "");
271289
_Static_assert(DBL_MAX_10_EXP == __DBL_MAX_10_EXP__, "");
272290
_Static_assert(LDBL_MAX_10_EXP == __LDBL_MAX_10_EXP__, "");
273291

274-
#if (__STDC_VERSION__ >= 202311L || !defined(__STRICT_ANSI__)) && __FINITE_MATH_ONLY__ == 0
292+
#if __STDC_VERSION__ >= 202311L || !defined(__STRICT_ANSI__)
293+
_Static_assert(FLT_NORM_MAX == __FLT_NORM_MAX__, "");
294+
_Static_assert(DBL_NORM_MAX == __DBL_NORM_MAX__, "");
295+
_Static_assert(LDBL_NORM_MAX == __LDBL_NORM_MAX__, "");
296+
297+
#if __FINITE_MATH_ONLY__ == 0
275298
// Ensure INFINITY and NAN are suitable for use in a constant expression.
276299
float f1 = INFINITY;
277300
float f2 = NAN;
278301
#endif
302+
#endif

clang/test/Preprocessor/init-aarch64.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
// AARCH64-NEXT: #define __DBL_MIN_10_EXP__ (-307)
7575
// AARCH64-NEXT: #define __DBL_MIN_EXP__ (-1021)
7676
// AARCH64-NEXT: #define __DBL_MIN__ 2.2250738585072014e-308
77+
// AARCH64-NEXT: #define __DBL_NORM_MAX__ 1.7976931348623157e+308
7778
// AARCH64-NEXT: #define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
7879
// AARCH64-NEXT: #define __ELF__ 1
7980
// AARCH64-NEXT: #define __FINITE_MATH_ONLY__ 0
@@ -91,6 +92,7 @@
9192
// AARCH64-NEXT: #define __FLT16_MIN_10_EXP__ (-4)
9293
// AARCH64-NEXT: #define __FLT16_MIN_EXP__ (-13)
9394
// AARCH64-NEXT: #define __FLT16_MIN__ 6.103515625e-5F16
95+
// AARCH64-NEXT: #define __FLT16_NORM_MAX__ 6.5504e+4F16
9496
// AARCH64-NEXT: #define __FLT_DECIMAL_DIG__ 9
9597
// AARCH64-NEXT: #define __FLT_DENORM_MIN__ 1.40129846e-45F
9698
// AARCH64-NEXT: #define __FLT_DIG__ 6
@@ -105,6 +107,7 @@
105107
// AARCH64-NEXT: #define __FLT_MIN_10_EXP__ (-37)
106108
// AARCH64-NEXT: #define __FLT_MIN_EXP__ (-125)
107109
// AARCH64-NEXT: #define __FLT_MIN__ 1.17549435e-38F
110+
// AARCH64-NEXT: #define __FLT_NORM_MAX__ 3.40282347e+38F
108111
// AARCH64-NEXT: #define __FLT_RADIX__ 2
109112
// AARCH64-NEXT: #define __FPCLASS_NEGINF 0x0004
110113
// AARCH64-NEXT: #define __FPCLASS_NEGNORMAL 0x0008
@@ -216,6 +219,7 @@
216219
// AARCH64-NEXT: #define __LDBL_MIN_10_EXP__ (-4931)
217220
// AARCH64-NEXT: #define __LDBL_MIN_EXP__ (-16381)
218221
// AARCH64-NEXT: #define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
222+
// AARCH64-NEXT: #define __LDBL_NORM_MAX__ 1.18973149535723176508575932662800702e+4932L
219223
// AARCH64_LE-NEXT: #define __LITTLE_ENDIAN__ 1
220224
// AARCH64-NEXT: #define __LLONG_WIDTH__ 64
221225
// AARCH64-NEXT: #define __LONG_LONG_MAX__ 9223372036854775807LL

clang/test/Preprocessor/init.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,6 +1648,7 @@
16481648
// WEBASSEMBLY-NEXT:#define __DBL_MIN_10_EXP__ (-307)
16491649
// WEBASSEMBLY-NEXT:#define __DBL_MIN_EXP__ (-1021)
16501650
// WEBASSEMBLY-NEXT:#define __DBL_MIN__ 2.2250738585072014e-308
1651+
// WEBASSEMBLY-NEXT:#define __DBL_NORM_MAX__ 1.7976931348623157e+308
16511652
// WEBASSEMBLY-NEXT:#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
16521653
// WEBASSEMBLY-NOT:#define __ELF__
16531654
// EMSCRIPTEN-THREADS-NEXT:#define __EMSCRIPTEN_PTHREADS__ 1
@@ -1668,6 +1669,7 @@
16681669
// WEBASSEMBLY-NOT:#define __FLT16_MIN_10_EXP__
16691670
// WEBASSEMBLY-NOT:#define __FLT16_MIN_EXP__
16701671
// WEBASSEMBLY-NOT:#define __FLT16_MIN__
1672+
// WEBASSEMBLY-NOT:#define __FLT16_NORM_MAX__
16711673
// WEBASSEMBLY-NEXT:#define __FLT_DECIMAL_DIG__ 9
16721674
// WEBASSEMBLY-NEXT:#define __FLT_DENORM_MIN__ 1.40129846e-45F
16731675
// WEBASSEMBLY-NEXT:#define __FLT_DIG__ 6
@@ -1682,6 +1684,7 @@
16821684
// WEBASSEMBLY-NEXT:#define __FLT_MIN_10_EXP__ (-37)
16831685
// WEBASSEMBLY-NEXT:#define __FLT_MIN_EXP__ (-125)
16841686
// WEBASSEMBLY-NEXT:#define __FLT_MIN__ 1.17549435e-38F
1687+
// WEBASSEMBLY-NEXT:#define __FLT_NORM_MAX__ 3.40282347e+38F
16851688
// WEBASSEMBLY-NEXT:#define __FLT_RADIX__ 2
16861689
// WEBASSEMBLY-NEXT:#define __FPCLASS_NEGINF 0x0004
16871690
// WEBASSEMBLY-NEXT:#define __FPCLASS_NEGNORMAL 0x0008
@@ -1806,6 +1809,7 @@
18061809
// WEBASSEMBLY-NEXT:#define __LDBL_MIN_10_EXP__ (-4931)
18071810
// WEBASSEMBLY-NEXT:#define __LDBL_MIN_EXP__ (-16381)
18081811
// WEBASSEMBLY-NEXT:#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
1812+
// WEBASSEMBLY-NEXT:#define __LDBL_NORM_MAX__ 1.18973149535723176508575932662800702e+4932L
18091813
// WEBASSEMBLY-NEXT:#define __LITTLE_ENDIAN__ 1
18101814
// WEBASSEMBLY-NEXT:#define __LLONG_WIDTH__ 64
18111815
// WEBASSEMBLY-NEXT:#define __LONG_LONG_MAX__ 9223372036854775807LL

0 commit comments

Comments
 (0)