diff mbox

<stdbool.h> should not define bool, true or false as macros for C++

Message ID CAH6eHdRJTZ-afUJqa8-V7SZPRH493WLopTjoHDMaL-agBsdC1w@mail.gmail.com
State New
Headers show

Commit Message

Jonathan Wakely Oct. 24, 2014, 7:32 p.m. UTC
I want to resurrect this patch that I didn't pursue for 4.8, because
our <stdbool.h> violates this very explicit requirement in the C++11
and C++14 standards:

18.10 [support.runtime] p8
"The header <cstdbool> and the header <stdbool.h> shall not define
macros named bool, true, or false."

Is the gcc/ginclude/stdbool.h change OK for trunk?

Tested x86_64-linux. I also looked in the Debian Code Search and it
seems that all the code which cares whether bool is a macro follows
one of these patterns:

#ifdef bool
#undef bool

#ifdef bool
  /* Leave if macro is from C99 stdbool.h */
  #ifndef __bool_true_false_are_defined
    #undef bool
(The __bool_true_false_are_defined macro *is* defined in C++)

#ifdef bool
#error bool should not be defined
#endif
(That's in the libc++ testsuite for <stdbool.h>, we fail that test obviously)

#ifdef bool
#define HAS_BOOL
#endif

So although that search only covers FOSS code I don't think we're
going to break much C++ code by doing this, and it's needed for C++11
anyway.



On 5 February 2012 13:00, Jonathan Wakely wrote:
> On 4 February 2012 23:35, Gerald Pfeifer wrote:
>> For what it's worth, I strongly suggest that you only define those when
>> __cpluplus is pre-C++11.
>>
>> There is simply too much software out there which will run into this
>
> Really? Why would any C++ code assume "bool" is defined as a macro?
> It's been a keyword in C++ for longer than C99 has defined it as a macro.
>
>> and being aggressive in breaking (admittedly non-standard confirming
>> programs) gives GCC a bad reputation and is not nice to our users to
>> begin with.
>
> Fair enough, this revised patch still defines bool, true and false for
> C++98 mode, but not for C++11 mode.
>
> gcc/
>         * ginclude/stdbool.h (true, false, bool): Do not define for C++11.
>
> libstdc++/
>        * testsuite/18_support/headers/cstdbool/macros.cc: New.
>
> Tested x86_64-linux, OK for trunk?
commit 4c76750dfd43a8102ee3de5ea0c5699be3359d7f
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Fri Oct 24 10:50:27 2014 +0100

    C++11 explicitly forbids macros for bool, true and false.
    
    gcc:
    	* ginclude/stdbool.h: Do not define bool, true or false in C++11.
    
    libstdc++-v3:
    	* testsuite/18_support/headers/cstdbool/macros.cc: New.

Comments

Jason Merrill Oct. 24, 2014, 8:49 p.m. UTC | #1
OK.  Gerald, were you thinking of specific software that would be 
affected by this change?

Jason
Gerald Pfeifer Oct. 27, 2014, 9:45 p.m. UTC | #2
On Friday 2014-10-24 16:49, Jason Merrill wrote:
> OK.  Gerald, were you thinking of specific software that would be 
> affected by this change?

I do not recall which pieces I had in mind back then.  

In general I did make the experience (updating the GCC ports for 
FreeBSD) that there is a lot of "interesting" software out there 
and that with every major release of GCC we are breaking a number 
of them, mostly via GCC frontend changes (code using templates 
being the primary case) and especially libstdc++.

Let's go ahead, brace for impact, and just fix whatever pops up.

To be fair my impression is that over the last couple of GCC
releases moving from one to the next has (again) become smoother
than in the past.

Gerald
diff mbox

Patch

diff --git a/gcc/ginclude/stdbool.h b/gcc/ginclude/stdbool.h
index f4e802f..a06f17f2 100644
--- a/gcc/ginclude/stdbool.h
+++ b/gcc/ginclude/stdbool.h
@@ -36,11 +36,15 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #else /* __cplusplus */
 
-/* Supporting <stdbool.h> in C++ is a GCC extension.  */
+/* Supporting _Bool in C++ is a GCC extension.  */
 #define _Bool	bool
+
+#if __cplusplus < 201103L
+/* Defining these macros in C++98 is a GCC extension.  */
 #define bool	bool
 #define false	false
 #define true	true
+#endif
 
 #endif /* __cplusplus */
 
diff --git a/libstdc++-v3/testsuite/18_support/headers/cstdbool/macros.cc b/libstdc++-v3/testsuite/18_support/headers/cstdbool/macros.cc
new file mode 100644
index 0000000..58631d8
--- /dev/null
+++ b/libstdc++-v3/testsuite/18_support/headers/cstdbool/macros.cc
@@ -0,0 +1,38 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 2012 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
+