From 83b83ae97a8d5d291a6209bad3610c686a7138e3 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 27 Oct 2008 15:01:28 +0000 Subject: re PR libstdc++/37522 (Incorrect vswprintf prototype breaks __to_xstring) 2008-10-27 Paolo Carlini PR libstdc++/37522 * config/os/mingw32/os_defines.h: Define _GLIBCXX_HAVE_BROKEN_VSWPRINTF * include/bits/basic_string.h: Guard string conversions with !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF) too. * testsuite/lib/libstdc++.exp (check_v3_target_string_conversions): New. * testsuite/lib/dg-options.exp (dg-require-string-conversions): New. * testsuite/21_strings/basic_string/numeric_conversions/char/stof.cc: Use the latter. * testsuite/21_strings/basic_string/numeric_conversions/char/stoll.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/char/stoi.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/char/stol.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/char/ stoull.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/char/stold.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/char/stoul.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/char/ to_string.cc: Likewise. * testsuite/21_strings/basic_string/numeric_conversions/char/stod.cc: Likewise. From-SVN: r141382 --- libstdc++-v3/ChangeLog | 28 +++++++++++ libstdc++-v3/config/os/mingw32/os_defines.h | 6 ++- libstdc++-v3/include/bits/basic_string.h | 3 +- .../basic_string/numeric_conversions/char/stod.cc | 6 +-- .../basic_string/numeric_conversions/char/stof.cc | 6 +-- .../basic_string/numeric_conversions/char/stoi.cc | 6 +-- .../basic_string/numeric_conversions/char/stol.cc | 6 +-- .../basic_string/numeric_conversions/char/stold.cc | 6 +-- .../basic_string/numeric_conversions/char/stoll.cc | 6 +-- .../basic_string/numeric_conversions/char/stoul.cc | 6 +-- .../numeric_conversions/char/stoull.cc | 6 +-- .../numeric_conversions/char/to_string.cc | 6 +-- libstdc++-v3/testsuite/lib/dg-options.exp | 9 ++++ libstdc++-v3/testsuite/lib/libstdc++.exp | 58 ++++++++++++++++++++++ 14 files changed, 120 insertions(+), 38 deletions(-) (limited to 'libstdc++-v3') diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 97ce9ef..af59f63 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,31 @@ +2008-10-27 Paolo Carlini + + PR libstdc++/37522 + * config/os/mingw32/os_defines.h: Define _GLIBCXX_HAVE_BROKEN_VSWPRINTF + * include/bits/basic_string.h: Guard string conversions with + !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF) too. + * testsuite/lib/libstdc++.exp (check_v3_target_string_conversions): + New. + * testsuite/lib/dg-options.exp (dg-require-string-conversions): New. + * testsuite/21_strings/basic_string/numeric_conversions/char/stof.cc: + Use the latter. + * testsuite/21_strings/basic_string/numeric_conversions/char/stoll.cc: + Likewise. + * testsuite/21_strings/basic_string/numeric_conversions/char/stoi.cc: + Likewise. + * testsuite/21_strings/basic_string/numeric_conversions/char/stol.cc: + Likewise. + * testsuite/21_strings/basic_string/numeric_conversions/char/ + stoull.cc: Likewise. + * testsuite/21_strings/basic_string/numeric_conversions/char/stold.cc: + Likewise. + * testsuite/21_strings/basic_string/numeric_conversions/char/stoul.cc: + Likewise. + * testsuite/21_strings/basic_string/numeric_conversions/char/ + to_string.cc: Likewise. + * testsuite/21_strings/basic_string/numeric_conversions/char/stod.cc: + Likewise. + 2008-10-24 Paolo Carlini * config/os/generic/error_constants.h (enum errc): Remove diff --git a/libstdc++-v3/config/os/mingw32/os_defines.h b/libstdc++-v3/config/os/mingw32/os_defines.h index 3ac8fff..017fd87 100644 --- a/libstdc++-v3/config/os/mingw32/os_defines.h +++ b/libstdc++-v3/config/os/mingw32/os_defines.h @@ -1,6 +1,7 @@ // Specific definitions for generic platforms -*- C++ -*- -// Copyright (C) 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +// Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +// 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 @@ -52,4 +53,7 @@ // See libstdc++/20806. #define _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM 1 +// See libstdc++/37522. +#define _GLIBCXX_HAVE_BROKEN_VSWPRINTF 1 + #endif diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index de4cf80..595a156 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -2562,7 +2562,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) _GLIBCXX_END_NAMESPACE -#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99)) +#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \ + && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) #include diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stod.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stod.cc index 765c5a2..1f6ec0f 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stod.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stod.cc @@ -1,4 +1,6 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-string-conversions "" } + // 2008-06-15 Paolo Carlini // Copyright (C) 2008 Free Software Foundation, Inc. @@ -29,8 +31,6 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 - bool test __attribute__((unused)) = false; using namespace std; @@ -129,8 +129,6 @@ test01() VERIFY( test ); VERIFY( d1 == -1.0 ); } - -#endif } int main() diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stof.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stof.cc index 5645c0a..32510e0 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stof.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stof.cc @@ -1,4 +1,6 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-string-conversions "" } + // 2008-06-15 Paolo Carlini // Copyright (C) 2008 Free Software Foundation, Inc. @@ -29,8 +31,6 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 - bool test __attribute__((unused)) = false; using namespace std; @@ -129,8 +129,6 @@ test01() VERIFY( test ); VERIFY( f1 == -1.0f ); } - -#endif } int main() diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoi.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoi.cc index 6f1efd0..0dc2df2 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoi.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoi.cc @@ -1,4 +1,6 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-string-conversions "" } + // 2008-06-15 Paolo Carlini // Copyright (C) 2008 Free Software Foundation, Inc. @@ -29,8 +31,6 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 - bool test __attribute__((unused)) = false; using namespace std; @@ -194,8 +194,6 @@ test01() } VERIFY( test ); VERIFY( i1 == 1 ); - -#endif } int main() diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stol.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stol.cc index 683063f..25970f2 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stol.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stol.cc @@ -1,4 +1,6 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-string-conversions "" } + // 2008-06-15 Paolo Carlini // Copyright (C) 2008 Free Software Foundation, Inc. @@ -29,8 +31,6 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 - bool test __attribute__((unused)) = false; using namespace std; @@ -157,8 +157,6 @@ test01() } VERIFY( test ); VERIFY( l1 == numeric_limits::min() ); - -#endif } int main() diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stold.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stold.cc index 3a5d73a..54f4ffe 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stold.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stold.cc @@ -1,4 +1,6 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-string-conversions "" } + // 2008-06-15 Paolo Carlini // Copyright (C) 2008 Free Software Foundation, Inc. @@ -29,8 +31,6 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 - bool test __attribute__((unused)) = false; using namespace std; @@ -106,8 +106,6 @@ test01() test = false; } VERIFY( test ); - -#endif } int main() diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoll.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoll.cc index 6d92215..b20c5c5 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoll.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoll.cc @@ -1,4 +1,6 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-string-conversions "" } + // 2008-06-15 Paolo Carlini // Copyright (C) 2008 Free Software Foundation, Inc. @@ -29,8 +31,6 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 - bool test __attribute__((unused)) = false; using namespace std; @@ -157,8 +157,6 @@ test01() } VERIFY( test ); VERIFY( ll1 == numeric_limits::min() ); - -#endif } int main() diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoul.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoul.cc index c2d6cea..20c6e08 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoul.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoul.cc @@ -1,4 +1,6 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-string-conversions "" } + // 2008-06-15 Paolo Carlini // Copyright (C) 2008 Free Software Foundation, Inc. @@ -29,8 +31,6 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 - bool test __attribute__((unused)) = false; using namespace std; @@ -144,8 +144,6 @@ test01() } VERIFY( test ); VERIFY( ul1 == numeric_limits::max() ); - -#endif } int main() diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoull.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoull.cc index 30c94ff..94ef496 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoull.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/stoull.cc @@ -1,4 +1,6 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-string-conversions "" } + // 2008-06-15 Paolo Carlini // Copyright (C) 2008 Free Software Foundation, Inc. @@ -29,8 +31,6 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 - bool test __attribute__((unused)) = false; using namespace std; @@ -144,8 +144,6 @@ test01() } VERIFY( test ); VERIFY( ull1 == numeric_limits::max() ); - -#endif } int main() diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/to_string.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/to_string.cc index 7a7d065..a332c41 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/to_string.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/char/to_string.cc @@ -1,4 +1,6 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-string-conversions "" } + // 2008-06-15 Paolo Carlini // Copyright (C) 2008 Free Software Foundation, Inc. @@ -27,8 +29,6 @@ void test01() { -#ifdef _GLIBCXX_USE_C99 - bool test __attribute__((unused)) = true; using namespace std; @@ -55,8 +55,6 @@ test01() long double ld2 = -4.0L; string six(to_string(ld2)); VERIFY( six == "-4.000000" ); - -#endif } int main() diff --git a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/testsuite/lib/dg-options.exp index 0f1bfcf..7807225 100644 --- a/libstdc++-v3/testsuite/lib/dg-options.exp +++ b/libstdc++-v3/testsuite/lib/dg-options.exp @@ -124,3 +124,12 @@ proc dg-require-nanosleep { args } { } return } + +proc dg-require-string-conversions { args } { + if { ![ check_v3_target_string_conversions ] } { + upvar dg-do-what dg-do-what + set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] + return + } + return +} diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp index 10eac62..8a4e8c4 100644 --- a/libstdc++-v3/testsuite/lib/libstdc++.exp +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp @@ -1236,3 +1236,61 @@ proc check_v3_target_nanosleep { } { verbose "check_v3_target_nanosleep: $et_nanosleep" 2 return $et_nanosleep } + +proc check_v3_target_string_conversions { } { + global cxxflags + global DEFAULT_CXXFLAGS + global et_string_conversions + + global tool + + if { ![info exists et_string_conversions_target_name] } { + set et_string_conversions_target_name "" + } + + # If the target has changed since we set the cached value, clear it. + set current_target [current_target_name] + if { $current_target != $et_string_conversions_target_name } { + verbose "check_v3_target_string_conversions: `$et_string_conversions_target_name'" 2 + set et_string_conversions_target_name $current_target + if [info exists et_string_conversions] { + verbose "check_v3_target_string_conversions: removing cached result" 2 + unset et_string_conversions + } + } + + if [info exists et_string_conversions] { + verbose "check_v3_target_string_conversions: using cached result" 2 + } else { + set et_string_conversions 0 + + # Set up and compile a C++0x test program that depends + # on the string_conversions facilities to be available. + set src string_conversions[pid].cc + set exe string_conversions[pid].exe + + set f [open $src "w"] + puts $f "#include " + puts $f "int main()" + puts $f "#if defined(_GLIBCXX_USE_C99) && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)" + puts $f "{ return 0; }" + puts $f "#endif" + close $f + + set cxxflags_saved $cxxflags + set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -Werror" + + set lines [v3_target_compile $src $exe executable ""] + set cxxflags $cxxflags_saved + file delete $src + + if [string match "" $lines] { + # No error message, compilation succeeded. + set et_string_conversions 1 + } else { + verbose "check_v3_target_string_conversions: compilation failed" 2 + } + } + verbose "check_v3_target_string_conversions: $et_string_conversions" 2 + return $et_string_conversions +} -- cgit v1.1