From: Jonathan Wakely Date: Tue, 10 Oct 2017 11:25:45 +0000 (+0100) Subject: PR libstdc++/82417 do not include C99 in strict modes X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5d2b8075260770dd213dbbffed5541c2594e3d81;p=gcc.git PR libstdc++/82417 do not include C99 in strict modes As an extension the C++ version of 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 at all). PR libstdc++/59087 PR libstdc++/82417 * include/c_compatibility/complex.h [!C++98 && __STRICT_ANSI__]: Do not include C library's . * 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 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 10d38a18cab..ed4ee2ca428 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2017-10-10 Jonathan Wakely + + PR libstdc++/59087 + PR libstdc++/82417 + * include/c_compatibility/complex.h [!C++98 && __STRICT_ANSI__]: Do + not include C library's . + * 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 * 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 b9af8472562..4b2343926ef 100644 --- a/libstdc++-v3/include/c_compatibility/complex.h +++ b/libstdc++-v3/include/c_compatibility/complex.h @@ -32,7 +32,9 @@ # include #endif -#if _GLIBCXX_HAVE_COMPLEX_H +#if __cplusplus >= 201103L && defined(__STRICT_ANSI__) +// For strict modes do not include the C library's , see PR 82417. +#elif _GLIBCXX_HAVE_COMPLEX_H # include_next # 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 70189627ca2..9b0def408c8 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 00000000000..22d84b2f14e --- /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 +// . + +// { dg-options "-std=c++11" } + +#include + +// Should be equivalent to #include +template class std::complex; + +#ifdef complex +# error "'complex' is defined as a macro by for -std=c++11" +#endif +#ifdef imaginary +# error "'imaginary' is defined as a macro by for -std=c++11" +#endif +#ifdef I +# error "'I' is defined as a macro by 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 00000000000..62674466c3d --- /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 +// . + +// { dg-options "-std=c++98" } + +#include + +// Should be equivalent to C99 , not C++ +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 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 00000000000..9110ae4ecb2 --- /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 +// . + +// { dg-options "-std=gnu++11" } + +#include + +// Should be equivalent to #include +template class std::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 + +#ifdef complex +# error "'complex' is defined as a macro by for -std=gnu++11" +#endif