From d78e147a14209d759f79a95ca0fcdffce924eb81 Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Mon, 1 Dec 2003 18:48:24 +0000 Subject: [PATCH] C++STYLE: Add exception bits. 2003-12-01 Benjamin Kosnik * docs/html/17_intro/C++STYLE: Add exception bits. * include/bits/fstream.tcc: Add location info to exception strings. * include/bits/stl_construct.h: Formatting tweaks. From-SVN: r74119 --- libstdc++-v3/ChangeLog | 7 +++++++ libstdc++-v3/docs/html/17_intro/C++STYLE | 20 +++++++++++++++++++- libstdc++-v3/include/bits/fstream.tcc | 9 ++++++--- libstdc++-v3/include/bits/stl_construct.h | 18 +++++++++--------- 4 files changed, 41 insertions(+), 13 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0a9e672..7b3acab 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2003-12-01 Benjamin Kosnik + + * docs/html/17_intro/C++STYLE: Add exception bits. + * include/bits/fstream.tcc: Add location info to exception strings. + + * include/bits/stl_construct.h: Formatting tweaks. + 2003-12-01 Paolo Carlini PR libstdc++/10378 diff --git a/libstdc++-v3/docs/html/17_intro/C++STYLE b/libstdc++-v3/docs/html/17_intro/C++STYLE index f838b83..90dc879 100644 --- a/libstdc++-v3/docs/html/17_intro/C++STYLE +++ b/libstdc++-v3/docs/html/17_intro/C++STYLE @@ -200,7 +200,25 @@ Notable areas of divergence from what may be previous local practice For more explanation and examples, see src/globals.cc. All such variables should be contained in that file, for simplicity. - +15. Exception abstractions + Use the exception abstractions found in functexcept.h, which allow + C++ programmers to use this library with -fno-exceptions. (Even if + that is rarely advisable, it's a necessary evil for backwards + compatibility.) + +16. Exception error messages + All start with the name of the function where the exception is + thrown, and then (optional) descriptive text is added. Example: + + __throw_logic_error("basic_string::_S_construct NULL not valid"); + + Reason: The verbose terminate handler prints out exception::what(), + as well as the typeinfo for the thrown exception. As this is the + default terminate handler, by putting location info into the + exception string, a very useful error message is printed out for + uncaught exceptions. So useful, in fact, that non-programmers can + give useful error messages, and programmers can intelligently + speculate what went wrong without even using a debugger. The library currently has a mixture of GNU-C and modern C++ coding styles. The GNU C usages will be combed out gradually. diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc index fe72183..ef4260b 100644 --- a/libstdc++-v3/include/bits/fstream.tcc +++ b/libstdc++-v3/include/bits/fstream.tcc @@ -254,7 +254,8 @@ namespace std // codecvt::max_length() is bogus. if (_M_ext_end - _M_ext_buf + __rlen > _M_ext_buf_size) { - __throw_ios_failure("codecvt::max_length() " + __throw_ios_failure("basic_filebuf::underflow " + "codecvt::max_length() " "is not valid"); } streamsize __elen = _M_file.xsgetn(_M_ext_end, __rlen); @@ -305,10 +306,12 @@ namespace std // However, reaching it while looping on partial means that // the file has got an incomplete character. if (__r == codecvt_base::partial) - __throw_ios_failure("incomplete character in file"); + __throw_ios_failure("basic_filebuf::underflow " + "incomplete character in file"); } else - __throw_ios_failure("invalid byte sequence in file"); + __throw_ios_failure("basic_filebuf::underflow " + "invalid byte sequence in file"); } return __ret; } diff --git a/libstdc++-v3/include/bits/stl_construct.h b/libstdc++-v3/include/bits/stl_construct.h index d33bd7d..c705c00 100644 --- a/libstdc++-v3/include/bits/stl_construct.h +++ b/libstdc++-v3/include/bits/stl_construct.h @@ -1,6 +1,6 @@ // nonstandard construct and destroy functions -*- C++ -*- -// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// Copyright (C) 2001, 2002, 2003 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 @@ -72,13 +72,13 @@ namespace std * object's constructor with an initializer. * @endif */ - template + template inline void _Construct(_T1* __p, const _T2& __value) { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 402. wrong new expression in [some_]allocator::construct - ::new (static_cast(__p)) _T1(__value); + ::new(static_cast(__p)) _T1(__value); } /** @@ -87,13 +87,13 @@ namespace std * object's default constructor (no initializers). * @endif */ - template + template inline void _Construct(_T1* __p) { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 402. wrong new expression in [some_]allocator::construct - ::new (static_cast(__p)) _T1(); + ::new(static_cast(__p)) _T1(); } /** @@ -101,7 +101,7 @@ namespace std * Destroy the object pointed to by a pointer type. * @endif */ - template + template inline void _Destroy(_Tp* __pointer) { __pointer->~_Tp(); } @@ -113,7 +113,7 @@ namespace std * This is a helper function used only by _Destroy(). * @endif */ - template + template inline void __destroy_aux(_ForwardIterator __first, _ForwardIterator __last, __false_type) { for ( ; __first != __last; ++__first) std::_Destroy(&*__first); } @@ -127,7 +127,7 @@ namespace std * This is a helper function used only by _Destroy(). * @endif */ - template + template inline void __destroy_aux(_ForwardIterator, _ForwardIterator, __true_type) { } @@ -139,7 +139,7 @@ namespace std * away, otherwise the objects' destructors must be invoked. * @endif */ - template + template inline void _Destroy(_ForwardIterator __first, _ForwardIterator __last) { -- 2.7.4