Hello,

here is a patch for PR54112. It does 2 things:
* #undef complex after including the system's complex.h
* in C++11, still include the system's complex.h

The C++11 standard says that including complex.h is equivalent to including <complex>, with the rationale that a C++ compiler can't parse a C99 complex.h header. However, g++, as an extension, handles _Complex, so it makes sense to also provide the prototypes for cacos and other C99 complex math functions.

Tested, no regression.

(Cc: Benjamin, who wrote the header)

2012-07-28  Marc Glisse  <marc.gli...@inria.fr>

        PR libstdc++/54112
        * include/c_compatibility/complex.h: Undefine complex, always
        include system's complex.h if present.
        * testsuite/26_numerics/complex/c99.cc: New testcase.
        * testsuite/17_intro/headers/c++1998/complex.cc: Likewise.

--
Marc Glisse
Index: libstdc++-v3/include/c_compatibility/complex.h
===================================================================
--- libstdc++-v3/include/c_compatibility/complex.h      (revision 189925)
+++ libstdc++-v3/include/c_compatibility/complex.h      (working copy)
@@ -23,20 +23,21 @@
 // <http://www.gnu.org/licenses/>.
 
 /** @file complex.h
  *  This is a Standard C++ Library header.
  */
 
 #include <bits/c++config.h>
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
 # include <ccomplex>
-#else
-# if _GLIBCXX_HAVE_COMPLEX_H
-#  include_next <complex.h>
-# endif
+#endif
+
+#if _GLIBCXX_HAVE_COMPLEX_H
+# include_next <complex.h>
+# undef complex
 #endif
 
 #ifndef _GLIBCXX_COMPLEX_H
 #define _GLIBCXX_COMPLEX_H 1
 
 #endif
Index: libstdc++-v3/testsuite/26_numerics/complex/c99.cc
===================================================================
--- libstdc++-v3/testsuite/26_numerics/complex/c99.cc   (revision 0)
+++ libstdc++-v3/testsuite/26_numerics/complex/c99.cc   (revision 0)
@@ -0,0 +1,36 @@
+// { 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/>.
+
+// libstdc++/54112
+#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
+}

Property changes on: libstdc++-v3/testsuite/26_numerics/complex/c99.cc
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision URL

Index: libstdc++-v3/testsuite/17_intro/headers/c++1998/complex.cc
===================================================================
--- libstdc++-v3/testsuite/17_intro/headers/c++1998/complex.cc  (revision 0)
+++ libstdc++-v3/testsuite/17_intro/headers/c++1998/complex.cc  (revision 0)
@@ -0,0 +1,26 @@
+// { dg-do compile }
+
+// 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/>.
+
+// libstdc++/54112
+#include <bits/c++config.h>
+#if _GLIBCXX_HAVE_COMPLEX_H
+# include <complex.h>
+#endif
+#include <tr1/complex>
+std::complex<double> x;

Property changes on: libstdc++-v3/testsuite/17_intro/headers/c++1998/complex.cc
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision URL

Reply via email to