Patchwork Keep the macro "complex" in C++03

login
register
mail settings
Submitter Marc Glisse
Date Feb. 13, 2013, 7:44 p.m.
Message ID <alpine.DEB.2.02.1302132036420.20716@stedding.saclay.inria.fr>
Download mbox | patch
Permalink /patch/220238/
State New
Headers show

Comments

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.
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

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

+}