On Wed, 23 Oct 2024 at 16:02, Jason Merrill <ja...@redhat.com> wrote: > > On 10/23/24 10:39 AM, Jonathan Wakely wrote: > > The __alignas_is_defined macro has been required by C++ since C++11, and > > C++ Library DR 4036 clarified that __alignof_is_defined should be > > defined too. > > > > The macros alignas and alignof should not be defined, as they're > > keywords in C++. > > > > Technically it's implementation-defined whether __STDC_VERSION__ is > > defined by a C++ compiler, but G++ does not define it. Adjusting the > > first #if this way works as intended: A C23 compiler will not enter the > > outer if-group and so will not define any of the macros, a C17 compiler > > will enter both if-groups and so define all the macros, and a C++ > > compiler will enter the outer if-group but not the inner if-group. > > > > gcc/ChangeLog: > > > > * ginclude/stdalign.h (__alignas_is_defined): Define for C++. > > (__alignof_is_defined): Likewise. > > Do we want to note somehow that these macros are deprecated since C++17?
The <cstdalign> header is deprecated in C++17, but the macros aren't if you get them via <stdalign.h>. They were deprecated for C++23 by my NB comment https://cplusplus.github.io/LWG/issue3827 Would you like it to be noted in the commit message, or in the header itself, something like this? --- a/gcc/ginclude/stdalign.h +++ b/gcc/ginclude/stdalign.h @@ -33,6 +33,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define alignof _Alignof #endif +/* These are defined for C++, but deprecated in C++23. */ #define __alignas_is_defined 1 #define __alignof_is_defined 1 I expect <stdalign.h> to be removed completely for C++26, if my P3348 is approved. I'm not sure if we want to add deprecation warnings to <stdalign.h> for C++26, or just make it empty. That's for another day anyway. > > libstdc++-v3/ChangeLog: > > > > * testsuite/18_support/headers/cstdalign/macros.cc: New test. > > --- > > > > The libc++ devs noticed recently that GCC's <stdalign.h> doesn't conform > > to the C++ requirements. > > > > Tested x86_64-linux. > > > > OK for trunk? > > > > gcc/ginclude/stdalign.h | 5 ++-- > > .../18_support/headers/cstdalign/macros.cc | 24 +++++++++++++++++++ > > 2 files changed, 27 insertions(+), 2 deletions(-) > > create mode 100644 > > libstdc++-v3/testsuite/18_support/headers/cstdalign/macros.cc > > > > diff --git a/gcc/ginclude/stdalign.h b/gcc/ginclude/stdalign.h > > index 5f82f2d68f2..af73c322624 100644 > > --- a/gcc/ginclude/stdalign.h > > +++ b/gcc/ginclude/stdalign.h > > @@ -26,11 +26,12 @@ see the files COPYING3 and COPYING.RUNTIME > > respectively. If not, see > > #ifndef _STDALIGN_H > > #define _STDALIGN_H > > > > -#if (!defined __cplusplus \ > > - && !(defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L)) > > +#if !(defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L) > > > > +#ifndef __cplusplus > > #define alignas _Alignas > > #define alignof _Alignof > > +#endif > > > > #define __alignas_is_defined 1 > > #define __alignof_is_defined 1 > > diff --git a/libstdc++-v3/testsuite/18_support/headers/cstdalign/macros.cc > > b/libstdc++-v3/testsuite/18_support/headers/cstdalign/macros.cc > > new file mode 100644 > > index 00000000000..c50c921cd59 > > --- /dev/null > > +++ b/libstdc++-v3/testsuite/18_support/headers/cstdalign/macros.cc > > @@ -0,0 +1,24 @@ > > +// { dg-options "-D_GLIBCXX_USE_DEPRECATED=1 -Wno-deprecated" } > > +// { dg-do preprocess { target c++11 } } > > + > > +#include <cstdalign> > > Should there also/instead be a test with <stdalign.h>? We don't usually (or ever?) bother to test the .h versions of headers. For these ones that are deprecated it probably makes sense to do so, because <stdalign.h> isn't deprecated, only <cstdalign>. So we should ensure that the .h forms work fine without diagnostics even in C++17 and later. I'll add more tests. > > + > > +#ifndef __alignas_is_defined > > +# error "The header <cstdalign> fails to define a macro named > > __alignas_is_defined" > > +#elif __alignas_is_defined != 1 > > +# error "__alignas_is_defined is not defined to 1 in <cstdalign>" > > +#endif > > + > > +#ifndef __alignof_is_defined > > +# error "The header <cstdalign> fails to define a macro named > > __alignof_is_defined" > > +#elif __alignof_is_defined != 1 > > +# error "__alignof_is_defined is not defined to 1 in <cstdalign>" > > +#endif > > + > > +#ifdef alignas > > +# error "The header <cstdalign> defines a macro named alignas" > > +#endif > > + > > +#ifdef alignof > > +# error "The header <cstdalign> defines a macro named alignof" > > +#endif >