Keep the macro "complex" in C++03

Submitted by Marc Glisse on Feb. 13, 2013, 7:44 p.m.

Details

Message ID alpine.DEB.2.02.1302132036420.20716@stedding.saclay.inria.fr
State New
Headers show

Commit Message

Marc Glisse Feb. 13, 2013, 7:44 p.m.
Hello,

this patch was tested on x86_64-linux-gnu. For the testcase, I randomly 
picked c99.cc which I copied and c++11 -> c++98, _Complex -> complex, but 
anything using the macro would do.

2013-02-13  Marc Glisse  <marc.glisse@inria.fr>

 	PR libstdc++/56111
 	* include/std/complex (complex): Undefine.
 	* include/c_compatibility/complex.h (complex): Only undefine if
 	<complex> has been included.
 	* testsuite/26_numerics/complex/56111.cc: New testcase.

Comments

Paolo Carlini Feb. 13, 2013, 9:12 p.m.
Hi,

>2013-02-13  Marc Glisse  <marc.glisse@inria.fr>
>
> 	PR libstdc++/56111
> 	* include/std/complex (complex): Undefine.
> 	* include/c_compatibility/complex.h (complex): Only undefine if
> 	<complex> has been included.
> 	* testsuite/26_numerics/complex/56111.cc: New testcase.

Patch is Ok, thanks. You may want to remove the test variable: it serves no purpose in a dg-do compile testcase with no VERIFYs in it.

Thanks again!
Paolo

Patch hide | download patch | download mbox

Index: include/std/complex
===================================================================
--- include/std/complex	(revision 196018)
+++ include/std/complex	(working copy)
@@ -37,20 +37,23 @@ 
 #define _GLIBCXX_COMPLEX 1
 
 #pragma GCC system_header
 
 #include <bits/c++config.h>
 #include <bits/cpp_type_traits.h>
 #include <ext/type_traits.h>
 #include <cmath>
 #include <sstream>
 
+// Get rid of a macro possibly defined in <complex.h>
+#undef complex
+
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   /**
    * @defgroup complex_numbers Complex Numbers
    * @ingroup numerics
    *
    * Classes and functions for complex numbers.
    * @{
Index: include/c_compatibility/complex.h
===================================================================
--- include/c_compatibility/complex.h	(revision 196018)
+++ include/c_compatibility/complex.h	(working copy)
@@ -27,17 +27,20 @@ 
  */
 
 #include <bits/c++config.h>
 
 #if __cplusplus >= 201103L
 # include <ccomplex>
 #endif
 
 #if _GLIBCXX_HAVE_COMPLEX_H
 # include_next <complex.h>
-# undef complex
+# ifdef _GLIBCXX_COMPLEX
+// See PR56111, keep the macro in C++03 if possible.
+#  undef complex
+# endif
 #endif
 
 #ifndef _GLIBCXX_COMPLEX_H
 #define _GLIBCXX_COMPLEX_H 1
 
 #endif
Index: testsuite/26_numerics/complex/56111.cc
===================================================================
--- testsuite/26_numerics/complex/56111.cc	(revision 0)
+++ testsuite/26_numerics/complex/56111.cc	(revision 0)
@@ -0,0 +1,38 @@ 
+// { dg-do compile }
+// { dg-options "-std=c++98" }
+
+// Copyright (C) 2013 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/>.
+
+// libstdc++/56111
+// In C++03, we try to keep the macro "complex" as long as it does not
+// conflict (std::complex).
+#include <bits/c++config.h>
+#if _GLIBCXX_HAVE_COMPLEX_H
+# include <complex.h>
+#endif
+
+int main()
+{
+  bool test __attribute__((unused)) = true;
+
+#if _GLIBCXX_HAVE_COMPLEX_H
+  double complex x = .5;
+  double complex y = cacos (x);
+  (void)y;
+#endif
+}