This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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
+

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]