diff options
author | Paolo Carlini <pcarlini@suse.de> | 2007-12-27 12:59:01 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2007-12-27 12:59:01 +0000 |
commit | 83588991c1d625a7127af35abeee9b094df95dc6 (patch) | |
tree | 2275fe8dfc8a8ef8d0e8b732dc63b1cbefd8423f /libstdc++-v3 | |
parent | ceac3d59adc0d45bbb067ac86c493930cb1839ee (diff) | |
download | gcc-83588991c1d625a7127af35abeee9b094df95dc6.zip gcc-83588991c1d625a7127af35abeee9b094df95dc6.tar.gz gcc-83588991c1d625a7127af35abeee9b094df95dc6.tar.bz2 |
re PR libstdc++/34538 ([DR 697] combination of sstream, invalid_argument and -std=c++0x breaks valid code)
2007-12-27 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/34538
* config/os/generic/error_constants.h (enum posix_errno): Move
inside namespace posix_error.
* include/std/system_error (error_category::posix,
error_code::error_code(posix_errno), error_code::posix): Adjust.
* src/system_error.cc (gnu_error_category::posix): Likewise.
* testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc:
Adjust.
* testsuite/27_io/basic_ostream/inserters_other/char/error_code.cc:
Likewise.
* testsuite/19_diagnostics/error_code/cons/1.cc: Likewise.
* testsuite/19_diagnostics/error_code/operators/bool.cc: Likewise.
* testsuite/19_diagnostics/error_code/operators/equal.cc: Likewise.
* testsuite/19_diagnostics/error_code/operators/not_equal.cc:
Likewise.
* testsuite/19_diagnostics/error_category/cons/copy_neg.cc: Likewise.
* testsuite/19_diagnostics/error_category/cons/default.cc: Likewise.
* testsuite/19_diagnostics/error_category/operators/equal.cc:
Likewise.
* testsuite/19_diagnostics/error_category/operators/not_equal.cc:
Likewise.
* testsuite/19_diagnostics/headers/system_error/types_std_c++0x.cc:
Likewise.
* testsuite/19_diagnostics/system_error/cons-1.cc: Likewise.
* testsuite/19_diagnostics/system_error/what-4.cc: Likewise.
* testsuite/19_diagnostics/headers/system_error/34538.cc: New.
From-SVN: r131200
Diffstat (limited to 'libstdc++-v3')
18 files changed, 170 insertions, 109 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 3b28137..f9fbeee 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,32 @@ +2007-12-27 Paolo Carlini <pcarlini@suse.de> + + PR libstdc++/34538 + * config/os/generic/error_constants.h (enum posix_errno): Move + inside namespace posix_error. + * include/std/system_error (error_category::posix, + error_code::error_code(posix_errno), error_code::posix): Adjust. + * src/system_error.cc (gnu_error_category::posix): Likewise. + * testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc: + Adjust. + * testsuite/27_io/basic_ostream/inserters_other/char/error_code.cc: + Likewise. + * testsuite/19_diagnostics/error_code/cons/1.cc: Likewise. + * testsuite/19_diagnostics/error_code/operators/bool.cc: Likewise. + * testsuite/19_diagnostics/error_code/operators/equal.cc: Likewise. + * testsuite/19_diagnostics/error_code/operators/not_equal.cc: + Likewise. + * testsuite/19_diagnostics/error_category/cons/copy_neg.cc: Likewise. + * testsuite/19_diagnostics/error_category/cons/default.cc: Likewise. + * testsuite/19_diagnostics/error_category/operators/equal.cc: + Likewise. + * testsuite/19_diagnostics/error_category/operators/not_equal.cc: + Likewise. + * testsuite/19_diagnostics/headers/system_error/types_std_c++0x.cc: + Likewise. + * testsuite/19_diagnostics/system_error/cons-1.cc: Likewise. + * testsuite/19_diagnostics/system_error/what-4.cc: Likewise. + * testsuite/19_diagnostics/headers/system_error/34538.cc: New. + 2007-12-26 Paolo Carlini <pcarlini@suse.de> * testsuite/25_algorithms/copy/34595.C: Rename to 34595.cc. diff --git a/libstdc++-v3/config/os/generic/error_constants.h b/libstdc++-v3/config/os/generic/error_constants.h index d3a9688..53bccdcb 100644 --- a/libstdc++-v3/config/os/generic/error_constants.h +++ b/libstdc++-v3/config/os/generic/error_constants.h @@ -40,6 +40,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) +namespace posix_error +{ enum posix_errno { address_family_not_supported = EAFNOSUPPORT, @@ -159,6 +161,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) wrong_protocol_type = EPROTOTYPE, no_posix_equivalent = 1L << 16 }; +} _GLIBCXX_END_NAMESPACE diff --git a/libstdc++-v3/include/std/system_error b/libstdc++-v3/include/std/system_error index 495360c..c2a1d01 100644 --- a/libstdc++-v3/include/std/system_error +++ b/libstdc++-v3/include/std/system_error @@ -65,7 +65,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) operator!=(const error_category& __other) const { return this != &__other; } - virtual posix_errno + virtual posix_error::posix_errno posix(int __v) const = 0; virtual const string& @@ -86,7 +86,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) error_code(int __v, const error_category& __cat) throw() : _M_value(__v), _M_cat(&__cat) { } - error_code(posix_errno __v) + error_code(posix_error::posix_errno __v) : _M_value(__v), _M_cat(&system_category) { } void @@ -109,7 +109,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) const error_category& category() const { return *_M_cat; } - posix_errno + posix_error::posix_errno posix() const throw() { return this->category().posix(_M_value); } // Safe bool idiom. diff --git a/libstdc++-v3/src/system_error.cc b/libstdc++-v3/src/system_error.cc index 1916254..81e73fc 100644 --- a/libstdc++-v3/src/system_error.cc +++ b/libstdc++-v3/src/system_error.cc @@ -44,7 +44,7 @@ namespace return category; } - virtual std::posix_errno + virtual std::posix_error::posix_errno posix(int __v) const { #ifdef _GLIBCXX_HAVE_SYS_NERR @@ -53,9 +53,9 @@ namespace const int last_errorno = std::numeric_limits<int>::max(); #endif if (__v > 0 && __v <= last_errorno) - return std::posix_errno(__v); + return std::posix_error::posix_errno(__v); else - return std::no_posix_equivalent; + return std::posix_error::no_posix_equivalent; } }; diff --git a/libstdc++-v3/testsuite/19_diagnostics/error_category/cons/copy_neg.cc b/libstdc++-v3/testsuite/19_diagnostics/error_category/cons/copy_neg.cc index b1665e9..2609c43 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/error_category/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/error_category/cons/copy_neg.cc @@ -27,9 +27,9 @@ namespace __gnu_test { struct test_category : public std::error_category { - virtual std::posix_errno + virtual std::posix_error::posix_errno posix(int __v) const - { return std::posix_errno(__v); } + { return std::posix_error::posix_errno(__v); } virtual const std::string& name() const diff --git a/libstdc++-v3/testsuite/19_diagnostics/error_category/cons/default.cc b/libstdc++-v3/testsuite/19_diagnostics/error_category/cons/default.cc index ae4f5b3..1072cc6 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/error_category/cons/default.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/error_category/cons/default.cc @@ -26,9 +26,9 @@ namespace __gnu_test { struct test_category : public std::error_category { - virtual std::posix_errno + virtual std::posix_error::posix_errno posix(int __v) const - { return std::posix_errno(__v); } + { return std::posix_error::posix_errno(__v); } virtual const std::string& name() const diff --git a/libstdc++-v3/testsuite/19_diagnostics/error_category/operators/equal.cc b/libstdc++-v3/testsuite/19_diagnostics/error_category/operators/equal.cc index 4d5b4cd..7b8a19c 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/error_category/operators/equal.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/error_category/operators/equal.cc @@ -26,9 +26,9 @@ namespace __gnu_test { struct test_category : public std::error_category { - virtual std::posix_errno + virtual std::posix_error::posix_errno posix(int __v) const - { return std::posix_errno(__v); } + { return std::posix_error::posix_errno(__v); } virtual const std::string& name() const diff --git a/libstdc++-v3/testsuite/19_diagnostics/error_category/operators/not_equal.cc b/libstdc++-v3/testsuite/19_diagnostics/error_category/operators/not_equal.cc index 7d5f8d3..043c8a2 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/error_category/operators/not_equal.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/error_category/operators/not_equal.cc @@ -26,9 +26,9 @@ namespace __gnu_test { struct test_category : public std::error_category { - virtual std::posix_errno + virtual std::posix_error::posix_errno posix(int __v) const - { return std::posix_errno(__v); } + { return std::posix_error::posix_errno(__v); } virtual const std::string& name() const diff --git a/libstdc++-v3/testsuite/19_diagnostics/error_code/cons/1.cc b/libstdc++-v3/testsuite/19_diagnostics/error_code/cons/1.cc index 8732e28..ea1316d 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/error_code/cons/1.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/error_code/cons/1.cc @@ -26,9 +26,9 @@ namespace __gnu_test { struct test_category : public std::error_category { - virtual std::posix_errno + virtual std::posix_error::posix_errno posix(int __v) const - { return std::posix_errno(__v); } + { return std::posix_error::posix_errno(__v); } virtual const std::string& name() const @@ -55,8 +55,8 @@ int main() VERIFY( e2.category() == cat ); // 3 - std::error_code e3(std::operation_not_supported); - VERIFY( e3.value() == int(std::operation_not_supported) ); + std::error_code e3(std::posix_error::operation_not_supported); + VERIFY( e3.value() == int(std::posix_error::operation_not_supported) ); VERIFY( e3.category() == std::system_category ); return 0; diff --git a/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/bool.cc b/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/bool.cc index 30b83d1..04fd44f 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/bool.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/bool.cc @@ -35,7 +35,7 @@ int main() } // 2 - std::error_code e2(std::operation_not_supported); + std::error_code e2(std::posix_error::operation_not_supported); if (e2) { VERIFY( true ); diff --git a/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/equal.cc b/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/equal.cc index e94c52a..a98ed90 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/equal.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/equal.cc @@ -26,9 +26,9 @@ namespace __gnu_test { struct test_category : public std::error_category { - virtual std::posix_errno + virtual std::posix_error::posix_errno posix(int __v) const - { return std::posix_errno(__v); } + { return std::posix_error::posix_errno(__v); } virtual const std::string& name() const @@ -45,7 +45,7 @@ int main() bool test __attribute__((unused)) = true; std::error_code e1; - std::error_code e2(std::operation_not_supported); + std::error_code e2(std::posix_error::operation_not_supported); VERIFY( e1 == e1 ); VERIFY( !(e1 == e2) ); diff --git a/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/not_equal.cc b/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/not_equal.cc index de487ee..0015345 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/not_equal.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/error_code/operators/not_equal.cc @@ -26,9 +26,9 @@ namespace __gnu_test { struct test_category : public std::error_category { - virtual std::posix_errno + virtual std::posix_error::posix_errno posix(int __v) const - { return std::posix_errno(__v); } + { return std::posix_error::posix_errno(__v); } virtual const std::string& name() const @@ -45,7 +45,7 @@ int main() bool test __attribute__((unused)) = true; std::error_code e1; - std::error_code e2(std::operation_not_supported); + std::error_code e2(std::posix_error::operation_not_supported); VERIFY( !(e1 != e1) ); VERIFY( e1 != e2 ); diff --git a/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/34538.cc b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/34538.cc new file mode 100644 index 0000000..d682a64 --- /dev/null +++ b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/34538.cc @@ -0,0 +1,29 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2007 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +#include <stdexcept> +#include <system_error> + +// libstdc++/34538 +int main() +{ + throw std::invalid_argument("foo"); +} diff --git a/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/types_std_c++0x.cc b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/types_std_c++0x.cc index 356b507..31b6d4b 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/types_std_c++0x.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/types_std_c++0x.cc @@ -28,127 +28,127 @@ namespace gnu using std::error_category; using std::system_category; - using std::posix_errno; - using std::address_family_not_supported; - using std::address_in_use; - using std::address_not_available; - using std::already_connected; - using std::argument_list_too_long; - using std::argument_out_of_domain; - using std:: bad_address; - using std::bad_file_descriptor; + using std::posix_error::posix_errno; + using std::posix_error::address_family_not_supported; + using std::posix_error::address_in_use; + using std::posix_error::address_not_available; + using std::posix_error::already_connected; + using std::posix_error::argument_list_too_long; + using std::posix_error::argument_out_of_domain; + using std::posix_error::bad_address; + using std::posix_error::bad_file_descriptor; #ifdef _GLIBCXX_HAVE_EBADMSG - using std::bad_message; + using std::posix_error::bad_message; #endif - using std::broken_pipe; - using std::connection_aborted; - using std::connection_already_in_progress; - using std::connection_refused; - using std::connection_reset; - using std::cross_device_link; - using std::destination_address_required; - using std::device_or_resource_busy; - using std::directory_not_empty; - using std::executable_format_error; - using std::file_exists; - using std::file_too_large; - using std::filename_too_long; - using std::function_not_supported; - using std::host_unreachable; - using std::identifier_removed; - using std::illegal_byte_sequence; - using std::inappropriate_io_control_operation; - using std::interrupted; - using std::invalid_argument; - using std::invalid_seek; - using std::io_error; - using std::is_a_directory; - using std::message_size; - using std::network_down; - using std::network_reset; - using std::network_unreachable; - using std::no_buffer_space; - using std::no_child_process; + using std::posix_error::broken_pipe; + using std::posix_error::connection_aborted; + using std::posix_error::connection_already_in_progress; + using std::posix_error::connection_refused; + using std::posix_error::connection_reset; + using std::posix_error::cross_device_link; + using std::posix_error::destination_address_required; + using std::posix_error::device_or_resource_busy; + using std::posix_error::directory_not_empty; + using std::posix_error::executable_format_error; + using std::posix_error::file_exists; + using std::posix_error::file_too_large; + using std::posix_error::filename_too_long; + using std::posix_error::function_not_supported; + using std::posix_error::host_unreachable; + using std::posix_error::identifier_removed; + using std::posix_error::illegal_byte_sequence; + using std::posix_error::inappropriate_io_control_operation; + using std::posix_error::interrupted; + using std::posix_error::invalid_argument; + using std::posix_error::invalid_seek; + using std::posix_error::io_error; + using std::posix_error::is_a_directory; + using std::posix_error::message_size; + using std::posix_error::network_down; + using std::posix_error::network_reset; + using std::posix_error::network_unreachable; + using std::posix_error::no_buffer_space; + using std::posix_error::no_child_process; #ifdef _GLIBCXX_HAVE_ENOLINK - using std::no_link; + using std::posix_error::no_link; #endif - using std::no_lock_available; + using std::posix_error::no_lock_available; #ifdef _GLIBCXX_HAVE_ENODATA - using std::no_message_available; + using std::posix_error::no_message_available; #endif - using std::no_message; - using std::no_posix_equivalent; - using std::no_protocol_option; - using std::no_space_on_device; + using std::posix_error::no_message; + using std::posix_error::no_posix_equivalent; + using std::posix_error::no_protocol_option; + using std::posix_error::no_space_on_device; #ifdef _GLIBCXX_HAVE_ENOSR - using std::no_stream_resources; + using std::posix_error::no_stream_resources; #endif - using std::no_such_device_or_address; - using std::no_such_device; - using std::no_such_file_or_directory; - using std::no_such_process; - using std::not_a_directory; - using std::not_a_socket; + using std::posix_error::no_such_device_or_address; + using std::posix_error::no_such_device; + using std::posix_error::no_such_file_or_directory; + using std::posix_error::no_such_process; + using std::posix_error::not_a_directory; + using std::posix_error::not_a_socket; #ifdef _GLIBCXX_HAVE_ENOSTR - using std::not_a_stream; + using std::posix_error::not_a_stream; #endif - using std::not_connected; - using std::not_enough_memory; - using std::not_supported; + using std::posix_error::not_connected; + using std::posix_error::not_enough_memory; + using std::posix_error::not_supported; #ifdef _GLIBCXX_HAVE_ECANCELED - using std::operation_canceled; + using std::posix_error::operation_canceled; #endif - using std::operation_in_progress; - using std::operation_not_permitted; - using std::operation_not_supported; - using std::operation_would_block; + using std::posix_error::operation_in_progress; + using std::posix_error::operation_not_permitted; + using std::posix_error::operation_not_supported; + using std::posix_error::operation_would_block; #ifdef _GLIBCXX_HAVE_EOWNERDEAD - using std::owner_dead; + using std::posix_error::owner_dead; #endif - using std::permission_denied; + using std::posix_error::permission_denied; #ifdef _GLIBCXX_HAVE_EPROTO - using std::protocol_error; + using std::posix_error::protocol_error; #endif - using std::protocol_not_supported; - using std::read_only_file_system; - using std::resource_deadlock_would_occur; - using std::resource_unavailable_try_again; - using std::result_out_of_range; + using std::posix_error::protocol_not_supported; + using std::posix_error::read_only_file_system; + using std::posix_error::resource_deadlock_would_occur; + using std::posix_error::resource_unavailable_try_again; + using std::posix_error::result_out_of_range; #ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE - using std::state_not_recoverable; + using std::posix_error::state_not_recoverable; #endif #ifdef _GLIBCXX_HAVE_ETIME - using std::stream_timeout; + using std::posix_error::stream_timeout; #endif - using std::text_file_busy; - using std::timed_out; - using std::too_many_files_open_in_system; - using std::too_many_files_open; - using std::too_many_links; - using std::too_many_synbolic_link_levels; + using std::posix_error::text_file_busy; + using std::posix_error::timed_out; + using std::posix_error::too_many_files_open_in_system; + using std::posix_error::too_many_files_open; + using std::posix_error::too_many_links; + using std::posix_error::too_many_synbolic_link_levels; #ifdef _GLIBCXX_HAVE_EOVERFLOW - using std::value_too_large; + using std::posix_error::value_too_large; #endif - using std::wrong_protocol_type; + using std::posix_error::wrong_protocol_type; } diff --git a/libstdc++-v3/testsuite/19_diagnostics/system_error/cons-1.cc b/libstdc++-v3/testsuite/19_diagnostics/system_error/cons-1.cc index 5348e5b..2885dad 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/system_error/cons-1.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/system_error/cons-1.cc @@ -27,7 +27,7 @@ int main() { bool test __attribute__((unused)) = true; const std::string s("too late: boulangerie out of pain au raisin"); - const std::error_code e(std::operation_not_supported); + const std::error_code e(std::posix_error::operation_not_supported); // 1 { diff --git a/libstdc++-v3/testsuite/19_diagnostics/system_error/what-4.cc b/libstdc++-v3/testsuite/19_diagnostics/system_error/what-4.cc index e6df84f..89570f0 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/system_error/what-4.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/system_error/what-4.cc @@ -32,7 +32,7 @@ void test01() bool test __attribute__((unused)) = true; std::string s("after nine thirty, this request cannot be met"); - std::system_error obj = std::system_error(s, std::invalid_argument); + std::system_error obj = std::system_error(s, std::posix_error::invalid_argument); std::string s1(obj.what()); std::string s2(obj.what()); VERIFY( s1 == s2 ); diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/char/error_code.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/char/error_code.cc index 3cac928..71c93e8 100644 --- a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/char/error_code.cc +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/char/error_code.cc @@ -32,7 +32,7 @@ void test() char buf[64]; error_code e1; - error_code e2(bad_address); + error_code e2(posix_error::bad_address); string s, s1, s2; { diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc index a83c9cb..73c838b 100644 --- a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc @@ -33,7 +33,7 @@ void test() wchar_t buf[64]; error_code e1; - error_code e2(bad_address); + error_code e2(posix_error::bad_address); wstring s, s1, s2; { |