[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman closed https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
@@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", AaronBallman wrote: Thank you Hubert! https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
@@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", hubert-reinterpretcast wrote: Yes, the value is correct for an interpretation where the `LDBL_MANT_DIG` is 106. https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
@@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", AaronBallman wrote: Ping @hubert-reinterpretcast @chenzheng1030 -- hoping to get this landed for Clang 19, just need verification that the value is correct here. https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
@@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", jcranmer-intel wrote: I'm pretty sure this is correct, but I'd rather prefer someone who knows PPC to confirm this. https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
@@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", AaronBallman wrote: Ping -- I think I've corrected the value (at least, I'm using the same value as GCC in this case). https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman updated https://github.com/llvm/llvm-project/pull/96643 >From 408c34b84966a256bb6e7fdf45758f5c77380bbe Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Tue, 25 Jun 2024 10:27:10 -0400 Subject: [PATCH 1/4] [C23] Add *_NORM_MAX macros to This adds the *_NORM_MAX macros to 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. --- clang/docs/ReleaseNotes.rst | 3 +++ clang/lib/Frontend/InitPreprocessor.cpp | 7 ++- clang/lib/Headers/float.h | 13 clang/test/Headers/float.c | 27 + 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index df579ae398c5e..8879a77ba4dd9 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -336,6 +336,9 @@ C23 Feature Support - Properly promote bit-fields of bit-precise integer types to the field's type rather than to ``int``. #GH87641 +- Added the ``FLT_NORM_MAX``, ``DBL_NORM_MAX``, and ``LDBL_NORM_MAX`` to the + freestanding implementation of that ships with Clang. + Non-comprehensive list of changes in this release - diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 55ec460064830..afc4c16ab685b 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", + "1.18973149535723176508575932662800702e+4932"); DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45", "4.9406564584124654e-324", "3.64519953188247460253e-4951", "4.94065645841246544176568792868221e-324", @@ -144,6 +148,7 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, DefPrefix += "_"; Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext); + Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext); Builder.defineMacro(DefPrefix + "HAS_DENORM__"); Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits)); Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits)); diff --git a/clang/lib/Headers/float.h b/clang/lib/Headers/float.h index 642c8f06cc938..61f65dad8debc 100644 --- a/clang/lib/Headers/float.h +++ b/clang/lib/Headers/float.h @@ -86,6 +86,12 @@ #undef DBL_HAS_SUBNORM #undef LDBL_HAS_SUBNORM # endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \ +!defined(__STRICT_ANSI__) +#undef FLT_NORM_MAX +#undef DBL_NORM_MAX +#undef LDBL_NORM_MAX +#endif #endif /* Characteristics of floating point types, C99 5.2.4.2.2 */ @@ -155,6 +161,13 @@ # define LDBL_HAS_SUBNORM __LDBL_HAS_DENORM__ #endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \ +!defined(__STRICT_ANSI__) +# define FLT_NORM_MAX __FLT_NORM_MAX__ +# define DBL_NORM_MAX __DBL_NORM_MAX__ +# define LDBL_NORM_MAX __LDBL_NORM_MAX__ +#endif + #ifdef __STDC_WANT_IEC_60559_TYPES_EXT__ # define FLT16_MANT_DIG__FLT16_MANT_DIG__ # define FLT16_DECIMAL_DIG __FLT16_DECIMAL_DIG__ diff --git a/clang/test/Headers/float.c b/clang/test/Headers/float.c index 70c11b0537537..59cc0faa074db 100644 --- a/clang/test/Headers/float.c +++ b/clang/test/Headers/float.c @@ -1,17 +1,21 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c89 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c99 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c23 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++11 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++14 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++17 -ffreestanding %s +// RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++23 -ffreestanding %s // expected-no-diagnostics /* Basic floating point conformance checks against: +- C23 Final Std. - N1570 draft of C11 Std. - N1256 draft of C99 Std. - http://port70.net/~nsz/c/c89/c89-draft.html draft of C89/C90 Std. */ /* +C23,5.2.5.3.3p21, pp. 25 C11,5.2.4.2.2p11, pp. 30 C99,5.2.4.2.2p9,pp. 25
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman edited https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
@@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", AaronBallman wrote: Good catch, thank you! I see now that GCC uses the following values for `long double`: ``` #define __LDBL_MAX__ 1.79769313486231580793728971405301e+308L #define __LDBL_NORM_MAX__ 8.98846567431157953864652595394501e+307L ``` so I should probably go with `8.98846567431157953864652595394501e+307` as the value? CC @hubert-reinterpretcast https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
@@ -207,6 +211,23 @@ #error "Mandatory macros {FLT,DBL,LDBL}_MAX_10_EXP are invalid." #endif +#if __STDC_VERSION__ >= 202311L || !defined(__STRICT_ANSI__) +#ifndef FLT_NORM_MAX + #error "Mandatory macro FLT_NORM_MAX is missing." +#else + _Static_assert(FLT_NORM_MAX >= 1.0E+37F, "Mandatory macro FLT_NORM_MAX is invalid."); +#endif +#ifndef DBL_NORM_MAX + #error "Mandatory macro DBL_NORM_MAX is missing." +#else + _Static_assert(DBL_NORM_MAX >= 1.0E+37F, "Mandatory macro DBL_NORM_MAX is invalid."); +#endif +#ifndef LDBL_NORM_MAX + #error "Mandatory macro LDBL_NORM_MAX is missing." +#else + _Static_assert(LDBL_NORM_MAX >= 1.0E+37F, "Mandatory macro LDBL_NORM_MAX is invalid."); +#endif +#endif AaronBallman wrote: Oops, no, that's copy pasta from me, good catch! I'll correct that. https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
@@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", jcranmer-intel wrote: I don't think this is the correct value for ppc double-double, since double-double is supposed to give a different result for NORM_MAX than MAX (indeed, that's explicitly the point of the new macros!) https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
@@ -207,6 +211,23 @@ #error "Mandatory macros {FLT,DBL,LDBL}_MAX_10_EXP are invalid." #endif +#if __STDC_VERSION__ >= 202311L || !defined(__STRICT_ANSI__) +#ifndef FLT_NORM_MAX + #error "Mandatory macro FLT_NORM_MAX is missing." +#else + _Static_assert(FLT_NORM_MAX >= 1.0E+37F, "Mandatory macro FLT_NORM_MAX is invalid."); +#endif +#ifndef DBL_NORM_MAX + #error "Mandatory macro DBL_NORM_MAX is missing." +#else + _Static_assert(DBL_NORM_MAX >= 1.0E+37F, "Mandatory macro DBL_NORM_MAX is invalid."); +#endif +#ifndef LDBL_NORM_MAX + #error "Mandatory macro LDBL_NORM_MAX is missing." +#else + _Static_assert(LDBL_NORM_MAX >= 1.0E+37F, "Mandatory macro LDBL_NORM_MAX is invalid."); +#endif +#endif zahiraam wrote: Did you mean here for the condition of `_Static_assert` to compare the macro to the same value ` 1.0E+37F`? https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff 2ae09052477e1a966afbc5482d88585f95694c53 486d9fb3f9f992831569e4b9e1eda0a54c777b3b --extensions 'h,cpp,c' -- clang/lib/Frontend/InitPreprocessor.cpp clang/lib/Headers/float.h clang/test/Headers/float.c clang/test/Preprocessor/init-aarch64.c clang/test/Preprocessor/init.c `` View the diff from clang-format here. ``diff diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index afc4c16ab6..d3b264eede 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -148,7 +148,7 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, DefPrefix += "_"; Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext); - Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext); + Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax) + Ext); Builder.defineMacro(DefPrefix + "HAS_DENORM__"); Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits)); Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits)); `` https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman unassigned https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman unassigned https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman unassigned https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman unassigned https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman unassigned https://github.com/llvm/llvm-project/pull/96643 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman updated https://github.com/llvm/llvm-project/pull/96643 >From 408c34b84966a256bb6e7fdf45758f5c77380bbe Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Tue, 25 Jun 2024 10:27:10 -0400 Subject: [PATCH 1/2] [C23] Add *_NORM_MAX macros to This adds the *_NORM_MAX macros to 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. --- clang/docs/ReleaseNotes.rst | 3 +++ clang/lib/Frontend/InitPreprocessor.cpp | 7 ++- clang/lib/Headers/float.h | 13 clang/test/Headers/float.c | 27 + 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index df579ae398c5e..8879a77ba4dd9 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -336,6 +336,9 @@ C23 Feature Support - Properly promote bit-fields of bit-precise integer types to the field's type rather than to ``int``. #GH87641 +- Added the ``FLT_NORM_MAX``, ``DBL_NORM_MAX``, and ``LDBL_NORM_MAX`` to the + freestanding implementation of that ships with Clang. + Non-comprehensive list of changes in this release - diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 55ec460064830..afc4c16ab685b 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", + "1.18973149535723176508575932662800702e+4932"); DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45", "4.9406564584124654e-324", "3.64519953188247460253e-4951", "4.94065645841246544176568792868221e-324", @@ -144,6 +148,7 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, DefPrefix += "_"; Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext); + Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext); Builder.defineMacro(DefPrefix + "HAS_DENORM__"); Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits)); Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits)); diff --git a/clang/lib/Headers/float.h b/clang/lib/Headers/float.h index 642c8f06cc938..61f65dad8debc 100644 --- a/clang/lib/Headers/float.h +++ b/clang/lib/Headers/float.h @@ -86,6 +86,12 @@ #undef DBL_HAS_SUBNORM #undef LDBL_HAS_SUBNORM # endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \ +!defined(__STRICT_ANSI__) +#undef FLT_NORM_MAX +#undef DBL_NORM_MAX +#undef LDBL_NORM_MAX +#endif #endif /* Characteristics of floating point types, C99 5.2.4.2.2 */ @@ -155,6 +161,13 @@ # define LDBL_HAS_SUBNORM __LDBL_HAS_DENORM__ #endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \ +!defined(__STRICT_ANSI__) +# define FLT_NORM_MAX __FLT_NORM_MAX__ +# define DBL_NORM_MAX __DBL_NORM_MAX__ +# define LDBL_NORM_MAX __LDBL_NORM_MAX__ +#endif + #ifdef __STDC_WANT_IEC_60559_TYPES_EXT__ # define FLT16_MANT_DIG__FLT16_MANT_DIG__ # define FLT16_DECIMAL_DIG __FLT16_DECIMAL_DIG__ diff --git a/clang/test/Headers/float.c b/clang/test/Headers/float.c index 70c11b0537537..59cc0faa074db 100644 --- a/clang/test/Headers/float.c +++ b/clang/test/Headers/float.c @@ -1,17 +1,21 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c89 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c99 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c23 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++11 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++14 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++17 -ffreestanding %s +// RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++23 -ffreestanding %s // expected-no-diagnostics /* Basic floating point conformance checks against: +- C23 Final Std. - N1570 draft of C11 Std. - N1256 draft of C99 Std. - http://port70.net/~nsz/c/c89/c89-draft.html draft of C89/C90 Std. */ /* +C23,5.2.5.3.3p21, pp. 25 C11,5.2.4.2.2p11, pp. 30 C99,5.2.4.2.2p9,pp. 25
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
llvmbot wrote: @llvm/pr-subscribers-backend-x86 Author: Aaron Ballman (AaronBallman) Changes This adds the *_NORM_MAX macros tofor 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. --- Full diff: https://github.com/llvm/llvm-project/pull/96643.diff 4 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+3) - (modified) clang/lib/Frontend/InitPreprocessor.cpp (+6-1) - (modified) clang/lib/Headers/float.h (+13) - (modified) clang/test/Headers/float.c (+27) ``diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index df579ae398c5e..8879a77ba4dd9 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -336,6 +336,9 @@ C23 Feature Support - Properly promote bit-fields of bit-precise integer types to the field's type rather than to ``int``. #GH87641 +- Added the ``FLT_NORM_MAX``, ``DBL_NORM_MAX``, and ``LDBL_NORM_MAX`` to the + freestanding implementation of that ships with Clang. + Non-comprehensive list of changes in this release - diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 55ec460064830..afc4c16ab685b 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", + "1.18973149535723176508575932662800702e+4932"); DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45", "4.9406564584124654e-324", "3.64519953188247460253e-4951", "4.94065645841246544176568792868221e-324", @@ -144,6 +148,7 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, DefPrefix += "_"; Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext); + Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext); Builder.defineMacro(DefPrefix + "HAS_DENORM__"); Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits)); Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits)); diff --git a/clang/lib/Headers/float.h b/clang/lib/Headers/float.h index 642c8f06cc938..61f65dad8debc 100644 --- a/clang/lib/Headers/float.h +++ b/clang/lib/Headers/float.h @@ -86,6 +86,12 @@ #undef DBL_HAS_SUBNORM #undef LDBL_HAS_SUBNORM # endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \ +!defined(__STRICT_ANSI__) +#undef FLT_NORM_MAX +#undef DBL_NORM_MAX +#undef LDBL_NORM_MAX +#endif #endif /* Characteristics of floating point types, C99 5.2.4.2.2 */ @@ -155,6 +161,13 @@ # define LDBL_HAS_SUBNORM __LDBL_HAS_DENORM__ #endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \ +!defined(__STRICT_ANSI__) +# define FLT_NORM_MAX __FLT_NORM_MAX__ +# define DBL_NORM_MAX __DBL_NORM_MAX__ +# define LDBL_NORM_MAX __LDBL_NORM_MAX__ +#endif + #ifdef __STDC_WANT_IEC_60559_TYPES_EXT__ # define FLT16_MANT_DIG__FLT16_MANT_DIG__ # define FLT16_DECIMAL_DIG __FLT16_DECIMAL_DIG__ diff --git a/clang/test/Headers/float.c b/clang/test/Headers/float.c index 70c11b0537537..59cc0faa074db 100644 --- a/clang/test/Headers/float.c +++ b/clang/test/Headers/float.c @@ -1,17 +1,21 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c89 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c99 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c23 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++11 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++14 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++17 -ffreestanding %s +// RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++23 -ffreestanding %s // expected-no-diagnostics /* Basic floating point conformance checks against: +- C23 Final Std. - N1570 draft of C11 Std. - N1256 draft of C99 Std. - http://port70.net/~nsz/c/c89/c89-draft.html draft of C89/C90 Std. */ /* +C23,5.2.5.3.3p21, pp. 25 C11,5.2.4.2.2p11, pp. 30 C99,5.2.4.2.2p9,pp. 25 C89,2.2.4.2 @@ -207,6 +211,23 @@ #error "Mandatory macros {FLT,DBL,LDBL}_MAX_10_EXP are invalid." #endif +#if __STDC_VERSION__ >
[clang] [C23] Add *_NORM_MAX macros to (PR #96643)
https://github.com/AaronBallman created https://github.com/llvm/llvm-project/pull/96643 This adds the *_NORM_MAX macros to 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. >From 408c34b84966a256bb6e7fdf45758f5c77380bbe Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Tue, 25 Jun 2024 10:27:10 -0400 Subject: [PATCH] [C23] Add *_NORM_MAX macros to This adds the *_NORM_MAX macros to 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. --- clang/docs/ReleaseNotes.rst | 3 +++ clang/lib/Frontend/InitPreprocessor.cpp | 7 ++- clang/lib/Headers/float.h | 13 clang/test/Headers/float.c | 27 + 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index df579ae398c5e..8879a77ba4dd9 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -336,6 +336,9 @@ C23 Feature Support - Properly promote bit-fields of bit-precise integer types to the field's type rather than to ``int``. #GH87641 +- Added the ``FLT_NORM_MAX``, ``DBL_NORM_MAX``, and ``LDBL_NORM_MAX`` to the + freestanding implementation of that ships with Clang. + Non-comprehensive list of changes in this release - diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 55ec460064830..afc4c16ab685b 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -113,7 +113,11 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext) { - const char *DenormMin, *Epsilon, *Max, *Min; + const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; + NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", + "1.7976931348623157e+308", "1.18973149535723176502e+4932", + "1.79769313486231580793728971405301e+308", + "1.18973149535723176508575932662800702e+4932"); DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45", "4.9406564584124654e-324", "3.64519953188247460253e-4951", "4.94065645841246544176568792868221e-324", @@ -144,6 +148,7 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, DefPrefix += "_"; Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext); + Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext); Builder.defineMacro(DefPrefix + "HAS_DENORM__"); Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits)); Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits)); diff --git a/clang/lib/Headers/float.h b/clang/lib/Headers/float.h index 642c8f06cc938..61f65dad8debc 100644 --- a/clang/lib/Headers/float.h +++ b/clang/lib/Headers/float.h @@ -86,6 +86,12 @@ #undef DBL_HAS_SUBNORM #undef LDBL_HAS_SUBNORM # endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \ +!defined(__STRICT_ANSI__) +#undef FLT_NORM_MAX +#undef DBL_NORM_MAX +#undef LDBL_NORM_MAX +#endif #endif /* Characteristics of floating point types, C99 5.2.4.2.2 */ @@ -155,6 +161,13 @@ # define LDBL_HAS_SUBNORM __LDBL_HAS_DENORM__ #endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \ +!defined(__STRICT_ANSI__) +# define FLT_NORM_MAX __FLT_NORM_MAX__ +# define DBL_NORM_MAX __DBL_NORM_MAX__ +# define LDBL_NORM_MAX __LDBL_NORM_MAX__ +#endif + #ifdef __STDC_WANT_IEC_60559_TYPES_EXT__ # define FLT16_MANT_DIG__FLT16_MANT_DIG__ # define FLT16_DECIMAL_DIG __FLT16_DECIMAL_DIG__ diff --git a/clang/test/Headers/float.c b/clang/test/Headers/float.c index 70c11b0537537..59cc0faa074db 100644 --- a/clang/test/Headers/float.c +++ b/clang/test/Headers/float.c @@ -1,17 +1,21 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c89 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c99 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c23 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++11 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++14 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++17 -ffreestanding %s +// RUN: %clang_cc1 -fsyntax-only -verify -xc++ -std=c++23 -ffreestanding %s // expected-no-diagnostics /* Basic floating point conformance checks against: +- C23 Final Std. - N1570 draft of C11 Std. - N1256 draft of C9