rs6000: Fix PR78263: Don't #define vector, pixel, bool for C++ with strict ANSI

Message ID 33503db2-15a3-b10e-e852-fca53aa2d096@linux.ibm.com
State New
Headers show
Series
  • rs6000: Fix PR78263: Don't #define vector, pixel, bool for C++ with strict ANSI
Related show

Commit Message

Bill Schmidt June 4, 2019, 4:09 p.m.
Hi,

We've had a long-standing issue (PR78263) with altivec.h wherein the #define of
bool causes difficulties with C++ code with strict ANSI requirements (-std=c++11
versus -std=gnu+11, for example).  This patch disables the AltiVec keywords from
being #define'd under those circumstances.

There is some small potential for fallout in package builds where <altivec.h> is
included, strict ANSI is required, the C++ "bool" keyword is not otherwise used,
and the AltiVec "vector" or "pixel" keywords appear in source.  This is
regrettable but necessary for language compliance.  In such cases, the correct
fix to the source code is to replace "vector" by "__vector", "bool" by "__bool",
and "pixel" by "__pixel".

I've added a target-specific C++ test to ensure the #define's are disabled.
This is the first target-specific C++ test for Power, so I created the new
g++.target/powerpc directory and added powerpc.exp there, based on the existing
aarch64.exp in a sister directory.

Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no regressions.
Is this okay for trunk?

Thanks,
Bill


[gcc]

2019-06-04  Bill Schmidt  <wschmidt@linux.ibm.com>

	PR target/78263
	* config/rs6000/altivec.h: Don't #define vector, pixel, bool for
	C++ with strict ANSI requirements.

[gcc/testsuite]

2019-06-04  Bill Schmidt  <wschmidt@linux.ibm.com>

	PR target/78263
	* g++.target/powerpc: New directory.
	* g++.target/powerpc/powerpc.exp: New test driver.
	* g++.target/powerpc/undef-bool-3.C: New.

Comments

Segher Boessenkool June 4, 2019, 7:42 p.m. | #1
Hi!

On Tue, Jun 04, 2019 at 11:09:44AM -0500, Bill Schmidt wrote:
> +   if any), so we do not need to define them as macros.  Also,

> +   avoid defining them as macros for C++ with strict ANSI, as

> +   this is not compatible.  */

>  

> -#if !defined(__APPLE_ALTIVEC__)

> -/* You are allowed to undef these for C++ compatibility.  */

> +#if !defined(__APPLE_ALTIVEC__) && (!defined(__STRICT_ANSI__) \

> +				    || !defined(__cplusplus))


Please write this as

#if !defined(__APPLE_ALTIVEC__) \
    && !(defined(__STRICT_ANSI__) && defined(__cplusplus))

> +# Exit immediately if this isn't a PowerPC target.

> +if {![istarget powerpc64*-*-*] } then {

> +  return

> +}


I think you meant powerpc*-*-*?

Okay with those things looked at / fixed / whatever.  Thanks!


Segher

Patch

Index: gcc/config/rs6000/altivec.h
===================================================================
--- gcc/config/rs6000/altivec.h	(revision 271907)
+++ gcc/config/rs6000/altivec.h	(working copy)
@@ -37,10 +37,12 @@ 
 /* If __APPLE_ALTIVEC__ is defined, the compiler supports 'vector',
    'pixel' and 'bool' as context-sensitive AltiVec keywords (in 
    non-AltiVec contexts, they revert to their original meanings,
-   if any), so we do not need to define them as macros.  */
+   if any), so we do not need to define them as macros.  Also,
+   avoid defining them as macros for C++ with strict ANSI, as
+   this is not compatible.  */
 
-#if !defined(__APPLE_ALTIVEC__)
-/* You are allowed to undef these for C++ compatibility.  */
+#if !defined(__APPLE_ALTIVEC__) && (!defined(__STRICT_ANSI__) \
+				    || !defined(__cplusplus))
 #define vector __vector
 #define pixel __pixel
 #define bool __bool
Index: gcc/testsuite/g++.target/powerpc/powerpc.exp
===================================================================
--- gcc/testsuite/g++.target/powerpc/powerpc.exp	(nonexistent)
+++ gcc/testsuite/g++.target/powerpc/powerpc.exp	(working copy)
@@ -0,0 +1,44 @@ 
+#  Specific regression driver for PowerPC.
+#  Copyright (C) 2019 Free Software Foundation, Inc.
+#
+#  This file is part of GCC.
+#
+#  GCC 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.
+#
+#  GCC 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 GCC; see the file COPYING3.  If not see
+#  <http://www.gnu.org/licenses/>.  */
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Exit immediately if this isn't a PowerPC target.
+if {![istarget powerpc64*-*-*] } then {
+  return
+}
+
+# Load support procs.
+load_lib g++-dg.exp
+
+global DEFAULT_CXXFLAGS
+if ![info exists DEFAULT_CXXFLAGS] then {
+    set DEFAULT_CXXFLAGS " -pedantic-errors"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] \
+        "" $DEFAULT_CXXFLAGS
+
+# All done.
+dg-finish
+
Index: gcc/testsuite/g++.target/powerpc/undef-bool-3.C
===================================================================
--- gcc/testsuite/g++.target/powerpc/undef-bool-3.C	(nonexistent)
+++ gcc/testsuite/g++.target/powerpc/undef-bool-3.C	(working copy)
@@ -0,0 +1,13 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=c++11" } */
+
+/* Test to ensure that "bool" is not #define'd in altivec.h for C++ when
+   we require strict ANSI.  We should compile without errors.  */
+
+#include <altivec.h>
+
+bool foo (int x)
+{
+  return x == 2;
+}
+