aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2017-10-10 12:25:45 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2017-10-10 12:25:45 +0100
commit5d2b8075260770dd213dbbffed5541c2594e3d81 (patch)
tree98170b46edf170d15a8630cb132720b144d7ad4b
parentefe040bf219da9f0aa2298c19909e392c784b3d3 (diff)
downloadgcc-5d2b8075260770dd213dbbffed5541c2594e3d81.zip
gcc-5d2b8075260770dd213dbbffed5541c2594e3d81.tar.gz
gcc-5d2b8075260770dd213dbbffed5541c2594e3d81.tar.bz2
PR libstdc++/82417 do not include C99 <complex.h> in strict modes
As an extension the C++ version of <complex.h> includes the C version, but that defines macros with non-reserved names that should not be defined in ISO C++. Only include the C header for non-strict modes, or for pre-C++11 (because C++98 doesn't mention <complex.h> at all). PR libstdc++/59087 PR libstdc++/82417 * include/c_compatibility/complex.h [!C++98 && __STRICT_ANSI__]: Do not include C library's <complex.h>. * testsuite/26_numerics/complex/c99.cc: Depend on __STRICT_ANSI__. * testsuite/26_numerics/headers/complex.h/std_c++11.h: New test. * testsuite/26_numerics/headers/complex.h/std_gnu++11.h: New test. * testsuite/26_numerics/headers/complex.h/std_c++98.h: New test. From-SVN: r253581
-rw-r--r--libstdc++-v3/ChangeLog11
-rw-r--r--libstdc++-v3/include/c_compatibility/complex.h4
-rw-r--r--libstdc++-v3/testsuite/26_numerics/complex/c99.cc3
-rw-r--r--libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++11.h33
-rw-r--r--libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++98.h55
-rw-r--r--libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_gnu++11.h52
6 files changed, 156 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 10d38a1..ed4ee2c 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,14 @@
+2017-10-10 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/59087
+ PR libstdc++/82417
+ * include/c_compatibility/complex.h [!C++98 && __STRICT_ANSI__]: Do
+ not include C library's <complex.h>.
+ * testsuite/26_numerics/complex/c99.cc: Depend on __STRICT_ANSI__.
+ * testsuite/26_numerics/headers/complex.h/std_c++11.h: New test.
+ * testsuite/26_numerics/headers/complex.h/std_gnu++11.h: New test.
+ * testsuite/26_numerics/headers/complex.h/std_c++98.h: New test.
+
2017-10-05 Jonathan Wakely <jwakely@redhat.com>
* testsuite/20_util/to_chars/1.cc: Add dg-require-string-conversions.
diff --git a/libstdc++-v3/include/c_compatibility/complex.h b/libstdc++-v3/include/c_compatibility/complex.h
index b9af847..4b23439 100644
--- a/libstdc++-v3/include/c_compatibility/complex.h
+++ b/libstdc++-v3/include/c_compatibility/complex.h
@@ -32,7 +32,9 @@
# include <ccomplex>
#endif
-#if _GLIBCXX_HAVE_COMPLEX_H
+#if __cplusplus >= 201103L && defined(__STRICT_ANSI__)
+// For strict modes do not include the C library's <complex.h>, see PR 82417.
+#elif _GLIBCXX_HAVE_COMPLEX_H
# include_next <complex.h>
# ifdef _GLIBCXX_COMPLEX
// See PR56111, keep the macro in C++03 if possible.
diff --git a/libstdc++-v3/testsuite/26_numerics/complex/c99.cc b/libstdc++-v3/testsuite/26_numerics/complex/c99.cc
index 7018962..9b0def4 100644
--- a/libstdc++-v3/testsuite/26_numerics/complex/c99.cc
+++ b/libstdc++-v3/testsuite/26_numerics/complex/c99.cc
@@ -26,7 +26,8 @@
int main()
{
-#if _GLIBCXX_HAVE_COMPLEX_H
+#if _GLIBCXX_HAVE_COMPLEX_H && !defined(__STRICT_ANSI__)
+ // This is a GNU extension.
double _Complex x = .5;
double _Complex y = cacos (x);
(void)y;
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++11.h b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++11.h
new file mode 100644
index 0000000..22d84b2
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++11.h
@@ -0,0 +1,33 @@
+// Copyright (C) 2017 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/>.
+
+// { dg-options "-std=c++11" }
+
+#include <complex.h>
+
+// Should be equivalent to #include <complex>
+template class std::complex<double>;
+
+#ifdef complex
+# error "'complex' is defined as a macro by <complex.h> for -std=c++11"
+#endif
+#ifdef imaginary
+# error "'imaginary' is defined as a macro by <complex.h> for -std=c++11"
+#endif
+#ifdef I
+# error "'I' is defined as a macro by <complex.h> for -std=c++11"
+#endif
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++98.h b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++98.h
new file mode 100644
index 0000000..6267446
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++98.h
@@ -0,0 +1,55 @@
+// Copyright (C) 2017 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/>.
+
+// { dg-options "-std=c++98" }
+
+#include <complex.h>
+
+// Should be equivalent to C99 <complex>, not C++ <complex>
+namespace std
+{
+ struct complex;
+}
+
+#if _GLIBCXX_HAVE_COMPLEX_H
+namespace test
+{
+ using ::cacos;
+ using ::casin;
+ using ::catan;
+ using ::ccos;
+ using ::csin;
+ using ::ctan;
+ using ::ccosh;
+ using ::csinh;
+ using ::ctanh;
+ using ::cexp;
+ using ::clog;
+ using ::cabs;
+ using ::cpow;
+ using ::csqrt;
+ using ::carg;
+ using ::cimag;
+ using ::conj;
+ using ::cproj;
+ using ::creal;
+}
+#endif
+
+#ifndef complex
+# error "'complex' is not defined as a macro by <complex.h> for -std=c++98"
+#endif
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_gnu++11.h b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_gnu++11.h
new file mode 100644
index 0000000..9110ae4
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_gnu++11.h
@@ -0,0 +1,52 @@
+// Copyright (C) 2017 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/>.
+
+// { dg-options "-std=gnu++11" }
+
+#include <complex.h>
+
+// Should be equivalent to #include <complex>
+template class std::complex<double>;
+
+#if _GLIBCXX_HAVE_COMPLEX_H
+namespace test
+{
+ using ::cacos;
+ using ::casin;
+ using ::catan;
+ using ::ccos;
+ using ::csin;
+ using ::ctan;
+ using ::ccosh;
+ using ::csinh;
+ using ::ctanh;
+ using ::cexp;
+ using ::clog;
+ using ::cabs;
+ using ::cpow;
+ using ::csqrt;
+ using ::carg;
+ using ::cimag;
+ using ::conj;
+ using ::cproj;
+ using ::creal;
+}
+#endif
+
+#ifdef complex
+# error "'complex' is defined as a macro by <complex.h> for -std=gnu++11"
+#endif