This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Implement C1X _Alignas, _Alignof, max_align_t, stdalign.h
On 7 November 2011 08:47, Jonathan Wakely wrote:
> On 7 November 2011 00:43, Jonathan Wakely wrote:
>> On 7 November 2011 00:37, Joseph S. Myers wrote:
>>> On Mon, 7 Nov 2011, Jonathan Wakely wrote:
>>>
>>>> On 6 November 2011 23:53, Joseph S. Myers wrote:
>>>> >
>>>> > As with stdnoreturn.h, the contents of stdalign.h are conditioned out
>>>> > for C++; I'll leave it to C++ people to work out what's most useful
>>>> > there if something nonempty is wanted (stdnoreturn.h is empty for C++,
>>>> > stdbool.h defines _Bool and bool to bool, true to true etc.).
>>>>
>>>> Thanks Joseph, that will allow use to provide <cstdalign> in libstdc++.
>>>>
>>>> By my reading of the C++11 standard, the __alignas_is_defined macro
>>>> should still be defined in C++, and alignof isn't mentioned, was that
>>>> a late addition to C1X?
>>>
>>> The move from alignof as a keyword to _Alignof as a keyword with alignof
>>> as a macro in stdalign.h was done at the London meeting (March 2011) in
>>> response to comment US20. ?stdnoreturn.h was also added at that meeting.
>>
>> Thanks for the info. ?I think treating alignof identically to alignas
>> for C++ makes sense then - the __alignof_is_defined macro is in the
>> reserved namespace so it's OK for a conforming C++11 implementation to
>> define it.
>>
>>> It looks like what GCC defines in stdbool.h for C++ goes beyond what C++11
>>> says it should ("The header <cstdbool> and the header <stdbool.h> shall
>>> not define macros named bool, true, or false.") ?stdint.h is another case
>>> needing adjustment for C++11, though there what I've suggested is that GCC
>>> should predefine __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS in C++11
>>> mode as the best way to work with all implementations of that header that
>>> follow what C99 footnotes suggest.
>>
>> Indeed - I was just noticing that the libstdc++ testsuite doesn't
>> check that stdbool.h doesn't define those macros.
>
>
> This patch adds <cstdalign> to libstdc++
>
> ? ? ? ?* acinclude.m4: Check for <stdalign.h>
> ? ? ? ?* configure: Regenerate.
> ? ? ? ?* config.h.in: Likewise.
> ? ? ? ?* include/Makefile.am: Add <cstdalign>.
> ? ? ? ?* include/Makefile.in: Regenerate.
> ? ? ? ?* include/c_global/cstdalign: New.
> ? ? ? ?* testsuite/18_support/headers/cstdalign/std_c++0x_neg.cc: New.
> ? ? ? ?* doc/xml/manual/backwards_compatibility.xml: Update.
> ? ? ? ?* doc/xml/manual/status_cxx2011.xml: Update.
>
> Tested x86_64-linux, committed to trunk.
And then this adjusts <stdalign.h> and <stdbool.h> for C++11 conformance.
C++11 requires stdbool.h so providing it is not a GCC extension, but
defining _Bool is. I don't see the point of defining bool, true and
false as macros in C++ and it's explicitly forbidden by C++11.
Personally I'd prefer if _Bool was a typedef rather than a macro, but
I haven't changed that.
gcc/ChangeLog:
* ginclude/stdalign.h (__alignas_is_defined, __alignof_is_defined):
Define for C++.
* ginclude/stdbool.h (bool, true, false): Do not define for C++.
libstdc++-v3/ChangeLog:
* testsuite/18_support/headers/cstdalign/macros.cc: New.
* testsuite/18_support/headers/cstdbool/macros.cc: New.
Tested x86_64-linux, OK for trunk?
Index: gcc/ginclude/stdalign.h
===================================================================
--- gcc/ginclude/stdalign.h (revision 181077)
+++ gcc/ginclude/stdalign.h (working copy)
@@ -31,9 +31,9 @@
#define alignas _Alignas
#define alignof _Alignof
+#endif
+
#define __alignas_is_defined 1
#define __alignof_is_defined 1
-#endif
-
#endif /* stdalign.h */
Index: gcc/ginclude/stdbool.h
===================================================================
--- gcc/ginclude/stdbool.h (revision 181077)
+++ gcc/ginclude/stdbool.h (working copy)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2009, 2011 Free Software Foundation, Inc.
This file is part of GCC.
@@ -36,11 +36,8 @@
#else /* __cplusplus */
-/* Supporting <stdbool.h> in C++ is a GCC extension. */
+/* Supporting _Bool in C++ is a GCC extension. */
#define _Bool bool
-#define bool bool
-#define false false
-#define true true
#endif /* __cplusplus */
Index: libstdc++-v3/testsuite/18_support/headers/cstdalign/macros.cc
===================================================================
--- libstdc++-v3/testsuite/18_support/headers/cstdalign/macros.cc (revision 0)
+++ libstdc++-v3/testsuite/18_support/headers/cstdalign/macros.cc (revision 0)
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <cstdalign>
+
+#ifdef alignas
+# error "The header <cstdalign> defines a macro named alignas"
+#endif
+
+#ifndef __alignas_is_defined
+# error "The header <cstdalign> fails to define a macro named __alignas_is_defined"
+#endif
+
Index: libstdc++-v3/testsuite/18_support/headers/cstdbool/macros.cc
===================================================================
--- libstdc++-v3/testsuite/18_support/headers/cstdbool/macros.cc (revision 0)
+++ libstdc++-v3/testsuite/18_support/headers/cstdbool/macros.cc (revision 0)
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <cstdbool>
+
+#ifndef __bool_true_false_are_defined
+# error "The header <cstdbool> fails to define a macro named __bool_true_false_are_defined"
+#endif
+
+#ifdef bool
+# error "The header <cstdbool> defines a macro named bool"
+#endif
+
+#ifdef true
+# error "The header <cstdbool> defines a macro named true"
+#endif
+
+#ifdef false
+# error "The header <cstdbool> defines a macro named false"
+#endif
+
- References:
- Implement C1X _Alignas, _Alignof, max_align_t, stdalign.h
- Re: Implement C1X _Alignas, _Alignof, max_align_t, stdalign.h
- Re: Implement C1X _Alignas, _Alignof, max_align_t, stdalign.h
- Re: Implement C1X _Alignas, _Alignof, max_align_t, stdalign.h
- Re: Implement C1X _Alignas, _Alignof, max_align_t, stdalign.h