+2003-12-01 Benjamin Kosnik <bkoz@redhat.com>
+
+ * 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 <pcarlini@suse.de>
PR libstdc++/10378
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.
// 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);
// 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;
}
// 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
* object's constructor with an initializer.
* @endif
*/
- template <class _T1, class _T2>
+ template<typename _T1, typename _T2>
inline void
_Construct(_T1* __p, const _T2& __value)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 402. wrong new expression in [some_]allocator::construct
- ::new (static_cast<void*>(__p)) _T1(__value);
+ ::new(static_cast<void*>(__p)) _T1(__value);
}
/**
* object's default constructor (no initializers).
* @endif
*/
- template <class _T1>
+ template<typename _T1>
inline void
_Construct(_T1* __p)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 402. wrong new expression in [some_]allocator::construct
- ::new (static_cast<void*>(__p)) _T1();
+ ::new(static_cast<void*>(__p)) _T1();
}
/**
* Destroy the object pointed to by a pointer type.
* @endif
*/
- template <class _Tp>
+ template<typename _Tp>
inline void
_Destroy(_Tp* __pointer)
{ __pointer->~_Tp(); }
* This is a helper function used only by _Destroy().
* @endif
*/
- template <class _ForwardIterator>
+ template<typename _ForwardIterator>
inline void
__destroy_aux(_ForwardIterator __first, _ForwardIterator __last, __false_type)
{ for ( ; __first != __last; ++__first) std::_Destroy(&*__first); }
* This is a helper function used only by _Destroy().
* @endif
*/
- template <class _ForwardIterator>
+ template<typename _ForwardIterator>
inline void
__destroy_aux(_ForwardIterator, _ForwardIterator, __true_type)
{ }
* away, otherwise the objects' destructors must be invoked.
* @endif
*/
- template <class _ForwardIterator>
+ template<typename _ForwardIterator>
inline void
_Destroy(_ForwardIterator __first, _ForwardIterator __last)
{