1*38fd1498Szrj // Debug-mode error formatting implementation -*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj // Copyright (C) 2003-2018 Free Software Foundation, Inc. 4*38fd1498Szrj // 5*38fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj // software; you can redistribute it and/or modify it under the 7*38fd1498Szrj // terms of the GNU General Public License as published by the 8*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj // any later version. 10*38fd1498Szrj 11*38fd1498Szrj // This library is distributed in the hope that it will be useful, 12*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj // GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj // 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj // You should have received a copy of the GNU General Public License and 21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj // <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj /** @file debug/formatter.h 26*38fd1498Szrj * This file is a GNU debug extension to the Standard C++ Library. 27*38fd1498Szrj */ 28*38fd1498Szrj 29*38fd1498Szrj #ifndef _GLIBCXX_DEBUG_FORMATTER_H 30*38fd1498Szrj #define _GLIBCXX_DEBUG_FORMATTER_H 1 31*38fd1498Szrj 32*38fd1498Szrj #include <bits/c++config.h> 33*38fd1498Szrj #include <bits/cpp_type_traits.h> 34*38fd1498Szrj 35*38fd1498Szrj #if __cpp_rtti 36*38fd1498Szrj # include <typeinfo> 37*38fd1498Szrj # define _GLIBCXX_TYPEID(_Type) &typeid(_Type) 38*38fd1498Szrj #else 39*38fd1498Szrj namespace std 40*38fd1498Szrj { 41*38fd1498Szrj class type_info; 42*38fd1498Szrj } 43*38fd1498Szrj # define _GLIBCXX_TYPEID(_Type) 0 44*38fd1498Szrj #endif 45*38fd1498Szrj 46*38fd1498Szrj namespace __gnu_debug 47*38fd1498Szrj { 48*38fd1498Szrj using std::type_info; 49*38fd1498Szrj 50*38fd1498Szrj template<typename _Iterator> 51*38fd1498Szrj bool __check_singular(const _Iterator&); 52*38fd1498Szrj 53*38fd1498Szrj class _Safe_sequence_base; 54*38fd1498Szrj 55*38fd1498Szrj template<typename _Iterator, typename _Sequence> 56*38fd1498Szrj class _Safe_iterator; 57*38fd1498Szrj 58*38fd1498Szrj template<typename _Iterator, typename _Sequence> 59*38fd1498Szrj class _Safe_local_iterator; 60*38fd1498Szrj 61*38fd1498Szrj template<typename _Sequence> 62*38fd1498Szrj class _Safe_sequence; 63*38fd1498Szrj 64*38fd1498Szrj enum _Debug_msg_id 65*38fd1498Szrj { 66*38fd1498Szrj // General checks 67*38fd1498Szrj __msg_valid_range, 68*38fd1498Szrj __msg_insert_singular, 69*38fd1498Szrj __msg_insert_different, 70*38fd1498Szrj __msg_erase_bad, 71*38fd1498Szrj __msg_erase_different, 72*38fd1498Szrj __msg_subscript_oob, 73*38fd1498Szrj __msg_empty, 74*38fd1498Szrj __msg_unpartitioned, 75*38fd1498Szrj __msg_unpartitioned_pred, 76*38fd1498Szrj __msg_unsorted, 77*38fd1498Szrj __msg_unsorted_pred, 78*38fd1498Szrj __msg_not_heap, 79*38fd1498Szrj __msg_not_heap_pred, 80*38fd1498Szrj // std::bitset checks 81*38fd1498Szrj __msg_bad_bitset_write, 82*38fd1498Szrj __msg_bad_bitset_read, 83*38fd1498Szrj __msg_bad_bitset_flip, 84*38fd1498Szrj // std::list checks 85*38fd1498Szrj __msg_self_splice, 86*38fd1498Szrj __msg_splice_alloc, 87*38fd1498Szrj __msg_splice_bad, 88*38fd1498Szrj __msg_splice_other, 89*38fd1498Szrj __msg_splice_overlap, 90*38fd1498Szrj // iterator checks 91*38fd1498Szrj __msg_init_singular, 92*38fd1498Szrj __msg_init_copy_singular, 93*38fd1498Szrj __msg_init_const_singular, 94*38fd1498Szrj __msg_copy_singular, 95*38fd1498Szrj __msg_bad_deref, 96*38fd1498Szrj __msg_bad_inc, 97*38fd1498Szrj __msg_bad_dec, 98*38fd1498Szrj __msg_iter_subscript_oob, 99*38fd1498Szrj __msg_advance_oob, 100*38fd1498Szrj __msg_retreat_oob, 101*38fd1498Szrj __msg_iter_compare_bad, 102*38fd1498Szrj __msg_compare_different, 103*38fd1498Szrj __msg_iter_order_bad, 104*38fd1498Szrj __msg_order_different, 105*38fd1498Szrj __msg_distance_bad, 106*38fd1498Szrj __msg_distance_different, 107*38fd1498Szrj // istream_iterator 108*38fd1498Szrj __msg_deref_istream, 109*38fd1498Szrj __msg_inc_istream, 110*38fd1498Szrj // ostream_iterator 111*38fd1498Szrj __msg_output_ostream, 112*38fd1498Szrj // istreambuf_iterator 113*38fd1498Szrj __msg_deref_istreambuf, 114*38fd1498Szrj __msg_inc_istreambuf, 115*38fd1498Szrj // forward_list 116*38fd1498Szrj __msg_insert_after_end, 117*38fd1498Szrj __msg_erase_after_bad, 118*38fd1498Szrj __msg_valid_range2, 119*38fd1498Szrj // unordered container local iterators 120*38fd1498Szrj __msg_local_iter_compare_bad, 121*38fd1498Szrj __msg_non_empty_range, 122*38fd1498Szrj // self move assign 123*38fd1498Szrj __msg_self_move_assign, 124*38fd1498Szrj // unordered container buckets 125*38fd1498Szrj __msg_bucket_index_oob, 126*38fd1498Szrj __msg_valid_load_factor, 127*38fd1498Szrj // others 128*38fd1498Szrj __msg_equal_allocs, 129*38fd1498Szrj __msg_insert_range_from_self, 130*38fd1498Szrj __msg_irreflexive_ordering 131*38fd1498Szrj }; 132*38fd1498Szrj 133*38fd1498Szrj class _Error_formatter 134*38fd1498Szrj { 135*38fd1498Szrj // Tags denoting the type of parameter for construction 136*38fd1498Szrj struct _Is_iterator { }; 137*38fd1498Szrj struct _Is_iterator_value_type { }; 138*38fd1498Szrj struct _Is_sequence { }; 139*38fd1498Szrj struct _Is_instance { }; 140*38fd1498Szrj 141*38fd1498Szrj public: 142*38fd1498Szrj /// Whether an iterator is constant, mutable, or unknown 143*38fd1498Szrj enum _Constness 144*38fd1498Szrj { 145*38fd1498Szrj __unknown_constness, 146*38fd1498Szrj __const_iterator, 147*38fd1498Szrj __mutable_iterator, 148*38fd1498Szrj __last_constness 149*38fd1498Szrj }; 150*38fd1498Szrj 151*38fd1498Szrj // The state of the iterator (fine-grained), if we know it. 152*38fd1498Szrj enum _Iterator_state 153*38fd1498Szrj { 154*38fd1498Szrj __unknown_state, 155*38fd1498Szrj __singular, // singular, may still be attached to a sequence 156*38fd1498Szrj __begin, // dereferenceable, and at the beginning 157*38fd1498Szrj __middle, // dereferenceable, not at the beginning 158*38fd1498Szrj __end, // past-the-end, may be at beginning if sequence empty 159*38fd1498Szrj __before_begin, // before begin 160*38fd1498Szrj __last_state 161*38fd1498Szrj }; 162*38fd1498Szrj 163*38fd1498Szrj // A parameter that may be referenced by an error message 164*38fd1498Szrj struct _Parameter 165*38fd1498Szrj { 166*38fd1498Szrj enum 167*38fd1498Szrj { 168*38fd1498Szrj __unused_param, 169*38fd1498Szrj __iterator, 170*38fd1498Szrj __sequence, 171*38fd1498Szrj __integer, 172*38fd1498Szrj __string, 173*38fd1498Szrj __instance, 174*38fd1498Szrj __iterator_value_type 175*38fd1498Szrj } _M_kind; 176*38fd1498Szrj 177*38fd1498Szrj struct _Type 178*38fd1498Szrj { 179*38fd1498Szrj const char* _M_name; 180*38fd1498Szrj const type_info* _M_type; 181*38fd1498Szrj }; 182*38fd1498Szrj 183*38fd1498Szrj struct _Instance : _Type 184*38fd1498Szrj { 185*38fd1498Szrj const void* _M_address; 186*38fd1498Szrj }; 187*38fd1498Szrj 188*38fd1498Szrj union 189*38fd1498Szrj { 190*38fd1498Szrj // When _M_kind == __iterator 191*38fd1498Szrj struct : _Instance 192*38fd1498Szrj { 193*38fd1498Szrj _Constness _M_constness; 194*38fd1498Szrj _Iterator_state _M_state; 195*38fd1498Szrj const void* _M_sequence; 196*38fd1498Szrj const type_info* _M_seq_type; 197*38fd1498Szrj } _M_iterator; 198*38fd1498Szrj 199*38fd1498Szrj // When _M_kind == __sequence 200*38fd1498Szrj _Instance _M_sequence; 201*38fd1498Szrj 202*38fd1498Szrj // When _M_kind == __integer 203*38fd1498Szrj struct 204*38fd1498Szrj { 205*38fd1498Szrj const char* _M_name; 206*38fd1498Szrj long _M_value; 207*38fd1498Szrj } _M_integer; 208*38fd1498Szrj 209*38fd1498Szrj // When _M_kind == __string 210*38fd1498Szrj struct 211*38fd1498Szrj { 212*38fd1498Szrj const char* _M_name; 213*38fd1498Szrj const char* _M_value; 214*38fd1498Szrj } _M_string; 215*38fd1498Szrj 216*38fd1498Szrj // When _M_kind == __instance 217*38fd1498Szrj _Instance _M_instance; 218*38fd1498Szrj 219*38fd1498Szrj // When _M_kind == __iterator_value_type 220*38fd1498Szrj _Type _M_iterator_value_type; 221*38fd1498Szrj } _M_variant; 222*38fd1498Szrj _Parameter_Parameter223*38fd1498Szrj _Parameter() : _M_kind(__unused_param), _M_variant() { } 224*38fd1498Szrj _Parameter_Parameter225*38fd1498Szrj _Parameter(long __value, const char* __name) 226*38fd1498Szrj : _M_kind(__integer), _M_variant() 227*38fd1498Szrj { 228*38fd1498Szrj _M_variant._M_integer._M_name = __name; 229*38fd1498Szrj _M_variant._M_integer._M_value = __value; 230*38fd1498Szrj } 231*38fd1498Szrj _Parameter_Parameter232*38fd1498Szrj _Parameter(const char* __value, const char* __name) 233*38fd1498Szrj : _M_kind(__string), _M_variant() 234*38fd1498Szrj { 235*38fd1498Szrj _M_variant._M_string._M_name = __name; 236*38fd1498Szrj _M_variant._M_string._M_value = __value; 237*38fd1498Szrj } 238*38fd1498Szrj 239*38fd1498Szrj template<typename _Iterator, typename _Sequence> _Parameter_Parameter240*38fd1498Szrj _Parameter(_Safe_iterator<_Iterator, _Sequence> const& __it, 241*38fd1498Szrj const char* __name, _Is_iterator) 242*38fd1498Szrj : _M_kind(__iterator), _M_variant() 243*38fd1498Szrj { 244*38fd1498Szrj _M_variant._M_iterator._M_name = __name; 245*38fd1498Szrj _M_variant._M_iterator._M_address = std::__addressof(__it); 246*38fd1498Szrj _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it); 247*38fd1498Szrj _M_variant._M_iterator._M_constness = 248*38fd1498Szrj std::__are_same<_Safe_iterator<_Iterator, _Sequence>, 249*38fd1498Szrj typename _Sequence::iterator>:: 250*38fd1498Szrj __value ? __mutable_iterator : __const_iterator; 251*38fd1498Szrj _M_variant._M_iterator._M_sequence = __it._M_get_sequence(); 252*38fd1498Szrj _M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence); 253*38fd1498Szrj 254*38fd1498Szrj if (__it._M_singular()) 255*38fd1498Szrj _M_variant._M_iterator._M_state = __singular; 256*38fd1498Szrj else 257*38fd1498Szrj { 258*38fd1498Szrj if (__it._M_is_before_begin()) 259*38fd1498Szrj _M_variant._M_iterator._M_state = __before_begin; 260*38fd1498Szrj else if (__it._M_is_end()) 261*38fd1498Szrj _M_variant._M_iterator._M_state = __end; 262*38fd1498Szrj else if (__it._M_is_begin()) 263*38fd1498Szrj _M_variant._M_iterator._M_state = __begin; 264*38fd1498Szrj else 265*38fd1498Szrj _M_variant._M_iterator._M_state = __middle; 266*38fd1498Szrj } 267*38fd1498Szrj } 268*38fd1498Szrj 269*38fd1498Szrj template<typename _Iterator, typename _Sequence> _Parameter_Parameter270*38fd1498Szrj _Parameter(_Safe_local_iterator<_Iterator, _Sequence> const& __it, 271*38fd1498Szrj const char* __name, _Is_iterator) 272*38fd1498Szrj : _M_kind(__iterator), _M_variant() 273*38fd1498Szrj { 274*38fd1498Szrj _M_variant._M_iterator._M_name = __name; 275*38fd1498Szrj _M_variant._M_iterator._M_address = std::__addressof(__it); 276*38fd1498Szrj _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it); 277*38fd1498Szrj _M_variant._M_iterator._M_constness = 278*38fd1498Szrj std::__are_same<_Safe_local_iterator<_Iterator, _Sequence>, 279*38fd1498Szrj typename _Sequence::local_iterator>:: 280*38fd1498Szrj __value ? __mutable_iterator : __const_iterator; 281*38fd1498Szrj _M_variant._M_iterator._M_sequence = __it._M_get_sequence(); 282*38fd1498Szrj _M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence); 283*38fd1498Szrj 284*38fd1498Szrj if (__it._M_singular()) 285*38fd1498Szrj _M_variant._M_iterator._M_state = __singular; 286*38fd1498Szrj else 287*38fd1498Szrj { 288*38fd1498Szrj if (__it._M_is_end()) 289*38fd1498Szrj _M_variant._M_iterator._M_state = __end; 290*38fd1498Szrj else if (__it._M_is_begin()) 291*38fd1498Szrj _M_variant._M_iterator._M_state = __begin; 292*38fd1498Szrj else 293*38fd1498Szrj _M_variant._M_iterator._M_state = __middle; 294*38fd1498Szrj } 295*38fd1498Szrj } 296*38fd1498Szrj 297*38fd1498Szrj template<typename _Type> _Parameter_Parameter298*38fd1498Szrj _Parameter(const _Type* const& __it, const char* __name, _Is_iterator) 299*38fd1498Szrj : _M_kind(__iterator), _M_variant() 300*38fd1498Szrj { 301*38fd1498Szrj _M_variant._M_iterator._M_name = __name; 302*38fd1498Szrj _M_variant._M_iterator._M_address = std::__addressof(__it); 303*38fd1498Szrj _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it); 304*38fd1498Szrj _M_variant._M_iterator._M_constness = __const_iterator; 305*38fd1498Szrj _M_variant._M_iterator._M_state = __it ? __unknown_state : __singular; 306*38fd1498Szrj _M_variant._M_iterator._M_sequence = 0; 307*38fd1498Szrj _M_variant._M_iterator._M_seq_type = 0; 308*38fd1498Szrj } 309*38fd1498Szrj 310*38fd1498Szrj template<typename _Type> _Parameter_Parameter311*38fd1498Szrj _Parameter(_Type* const& __it, const char* __name, _Is_iterator) 312*38fd1498Szrj : _M_kind(__iterator), _M_variant() 313*38fd1498Szrj { 314*38fd1498Szrj _M_variant._M_iterator._M_name = __name; 315*38fd1498Szrj _M_variant._M_iterator._M_address = std::__addressof(__it); 316*38fd1498Szrj _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it); 317*38fd1498Szrj _M_variant._M_iterator._M_constness = __mutable_iterator; 318*38fd1498Szrj _M_variant._M_iterator._M_state = __it ? __unknown_state : __singular; 319*38fd1498Szrj _M_variant._M_iterator._M_sequence = 0; 320*38fd1498Szrj _M_variant._M_iterator._M_seq_type = 0; 321*38fd1498Szrj } 322*38fd1498Szrj 323*38fd1498Szrj template<typename _Iterator> _Parameter_Parameter324*38fd1498Szrj _Parameter(_Iterator const& __it, const char* __name, _Is_iterator) 325*38fd1498Szrj : _M_kind(__iterator), _M_variant() 326*38fd1498Szrj { 327*38fd1498Szrj _M_variant._M_iterator._M_name = __name; 328*38fd1498Szrj _M_variant._M_iterator._M_address = std::__addressof(__it); 329*38fd1498Szrj _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it); 330*38fd1498Szrj _M_variant._M_iterator._M_constness = __unknown_constness; 331*38fd1498Szrj _M_variant._M_iterator._M_state = 332*38fd1498Szrj __gnu_debug::__check_singular(__it) ? __singular : __unknown_state; 333*38fd1498Szrj _M_variant._M_iterator._M_sequence = 0; 334*38fd1498Szrj _M_variant._M_iterator._M_seq_type = 0; 335*38fd1498Szrj } 336*38fd1498Szrj 337*38fd1498Szrj template<typename _Sequence> _Parameter_Parameter338*38fd1498Szrj _Parameter(const _Safe_sequence<_Sequence>& __seq, 339*38fd1498Szrj const char* __name, _Is_sequence) 340*38fd1498Szrj : _M_kind(__sequence), _M_variant() 341*38fd1498Szrj { 342*38fd1498Szrj _M_variant._M_sequence._M_name = __name; 343*38fd1498Szrj _M_variant._M_sequence._M_address = 344*38fd1498Szrj static_cast<const _Sequence*>(std::__addressof(__seq)); 345*38fd1498Szrj _M_variant._M_sequence._M_type = _GLIBCXX_TYPEID(_Sequence); 346*38fd1498Szrj } 347*38fd1498Szrj 348*38fd1498Szrj template<typename _Sequence> _Parameter_Parameter349*38fd1498Szrj _Parameter(const _Sequence& __seq, const char* __name, _Is_sequence) 350*38fd1498Szrj : _M_kind(__sequence), _M_variant() 351*38fd1498Szrj { 352*38fd1498Szrj _M_variant._M_sequence._M_name = __name; 353*38fd1498Szrj _M_variant._M_sequence._M_address = std::__addressof(__seq); 354*38fd1498Szrj _M_variant._M_sequence._M_type = _GLIBCXX_TYPEID(_Sequence); 355*38fd1498Szrj } 356*38fd1498Szrj 357*38fd1498Szrj template<typename _Iterator> _Parameter_Parameter358*38fd1498Szrj _Parameter(const _Iterator& __it, const char* __name, 359*38fd1498Szrj _Is_iterator_value_type) 360*38fd1498Szrj : _M_kind(__iterator_value_type), _M_variant() 361*38fd1498Szrj { 362*38fd1498Szrj _M_variant._M_iterator_value_type._M_name = __name; 363*38fd1498Szrj _M_variant._M_iterator_value_type._M_type = 364*38fd1498Szrj _GLIBCXX_TYPEID(typename std::iterator_traits<_Iterator>::value_type); 365*38fd1498Szrj } 366*38fd1498Szrj 367*38fd1498Szrj template<typename _Type> _Parameter_Parameter368*38fd1498Szrj _Parameter(const _Type& __inst, const char* __name, _Is_instance) 369*38fd1498Szrj : _M_kind(__instance), _M_variant() 370*38fd1498Szrj { 371*38fd1498Szrj _M_variant._M_instance._M_name = __name; 372*38fd1498Szrj _M_variant._M_instance._M_address = &__inst; 373*38fd1498Szrj _M_variant._M_instance._M_type = _GLIBCXX_TYPEID(_Type); 374*38fd1498Szrj } 375*38fd1498Szrj 376*38fd1498Szrj #if !_GLIBCXX_INLINE_VERSION 377*38fd1498Szrj void 378*38fd1498Szrj _M_print_field(const _Error_formatter* __formatter, 379*38fd1498Szrj const char* __name) const _GLIBCXX_DEPRECATED; 380*38fd1498Szrj 381*38fd1498Szrj void 382*38fd1498Szrj _M_print_description(const _Error_formatter* __formatter) 383*38fd1498Szrj const _GLIBCXX_DEPRECATED; 384*38fd1498Szrj #endif 385*38fd1498Szrj }; 386*38fd1498Szrj 387*38fd1498Szrj template<typename _Iterator> 388*38fd1498Szrj _Error_formatter& 389*38fd1498Szrj _M_iterator(const _Iterator& __it, const char* __name = 0) 390*38fd1498Szrj { 391*38fd1498Szrj if (_M_num_parameters < std::size_t(__max_parameters)) 392*38fd1498Szrj _M_parameters[_M_num_parameters++] = _Parameter(__it, __name, 393*38fd1498Szrj _Is_iterator()); 394*38fd1498Szrj return *this; 395*38fd1498Szrj } 396*38fd1498Szrj 397*38fd1498Szrj template<typename _Iterator> 398*38fd1498Szrj _Error_formatter& 399*38fd1498Szrj _M_iterator_value_type(const _Iterator& __it, 400*38fd1498Szrj const char* __name = 0) 401*38fd1498Szrj { 402*38fd1498Szrj if (_M_num_parameters < __max_parameters) 403*38fd1498Szrj _M_parameters[_M_num_parameters++] = 404*38fd1498Szrj _Parameter(__it, __name, _Is_iterator_value_type()); 405*38fd1498Szrj return *this; 406*38fd1498Szrj } 407*38fd1498Szrj 408*38fd1498Szrj _Error_formatter& 409*38fd1498Szrj _M_integer(long __value, const char* __name = 0) 410*38fd1498Szrj { 411*38fd1498Szrj if (_M_num_parameters < __max_parameters) 412*38fd1498Szrj _M_parameters[_M_num_parameters++] = _Parameter(__value, __name); 413*38fd1498Szrj return *this; 414*38fd1498Szrj } 415*38fd1498Szrj 416*38fd1498Szrj _Error_formatter& 417*38fd1498Szrj _M_string(const char* __value, const char* __name = 0) 418*38fd1498Szrj { 419*38fd1498Szrj if (_M_num_parameters < __max_parameters) 420*38fd1498Szrj _M_parameters[_M_num_parameters++] = _Parameter(__value, __name); 421*38fd1498Szrj return *this; 422*38fd1498Szrj } 423*38fd1498Szrj 424*38fd1498Szrj template<typename _Sequence> 425*38fd1498Szrj _Error_formatter& 426*38fd1498Szrj _M_sequence(const _Sequence& __seq, const char* __name = 0) 427*38fd1498Szrj { 428*38fd1498Szrj if (_M_num_parameters < __max_parameters) 429*38fd1498Szrj _M_parameters[_M_num_parameters++] = _Parameter(__seq, __name, 430*38fd1498Szrj _Is_sequence()); 431*38fd1498Szrj return *this; 432*38fd1498Szrj } 433*38fd1498Szrj 434*38fd1498Szrj template<typename _Type> 435*38fd1498Szrj _Error_formatter& 436*38fd1498Szrj _M_instance(const _Type& __inst, const char* __name = 0) 437*38fd1498Szrj { 438*38fd1498Szrj if (_M_num_parameters < __max_parameters) 439*38fd1498Szrj _M_parameters[_M_num_parameters++] = _Parameter(__inst, __name, 440*38fd1498Szrj _Is_instance()); 441*38fd1498Szrj return *this; 442*38fd1498Szrj } 443*38fd1498Szrj 444*38fd1498Szrj _Error_formatter& _M_message(const char * __text)445*38fd1498Szrj _M_message(const char* __text) 446*38fd1498Szrj { _M_text = __text; return *this; } 447*38fd1498Szrj 448*38fd1498Szrj // Kept const qualifier for backward compatibility, to keep the same 449*38fd1498Szrj // exported symbol. 450*38fd1498Szrj _Error_formatter& 451*38fd1498Szrj _M_message(_Debug_msg_id __id) const throw (); 452*38fd1498Szrj 453*38fd1498Szrj _GLIBCXX_NORETURN void 454*38fd1498Szrj _M_error() const; 455*38fd1498Szrj 456*38fd1498Szrj #if !_GLIBCXX_INLINE_VERSION 457*38fd1498Szrj template<typename _Tp> 458*38fd1498Szrj void 459*38fd1498Szrj _M_format_word(char*, int, const char*, _Tp) 460*38fd1498Szrj const throw () _GLIBCXX_DEPRECATED; 461*38fd1498Szrj 462*38fd1498Szrj void 463*38fd1498Szrj _M_print_word(const char* __word) const _GLIBCXX_DEPRECATED; 464*38fd1498Szrj 465*38fd1498Szrj void 466*38fd1498Szrj _M_print_string(const char* __string) const _GLIBCXX_DEPRECATED; 467*38fd1498Szrj #endif 468*38fd1498Szrj 469*38fd1498Szrj private: _Error_formatter(const char * __file,unsigned int __line)470*38fd1498Szrj _Error_formatter(const char* __file, unsigned int __line) 471*38fd1498Szrj : _M_file(__file), _M_line(__line), _M_num_parameters(0), _M_text(0) 472*38fd1498Szrj { } 473*38fd1498Szrj 474*38fd1498Szrj #if !_GLIBCXX_INLINE_VERSION 475*38fd1498Szrj void 476*38fd1498Szrj _M_get_max_length() const throw () _GLIBCXX_DEPRECATED; 477*38fd1498Szrj #endif 478*38fd1498Szrj 479*38fd1498Szrj enum { __max_parameters = 9 }; 480*38fd1498Szrj 481*38fd1498Szrj const char* _M_file; 482*38fd1498Szrj unsigned int _M_line; 483*38fd1498Szrj _Parameter _M_parameters[__max_parameters]; 484*38fd1498Szrj unsigned int _M_num_parameters; 485*38fd1498Szrj const char* _M_text; 486*38fd1498Szrj 487*38fd1498Szrj public: 488*38fd1498Szrj static _Error_formatter& _M_at(const char * __file,unsigned int __line)489*38fd1498Szrj _M_at(const char* __file, unsigned int __line) 490*38fd1498Szrj { 491*38fd1498Szrj static _Error_formatter __formatter(__file, __line); 492*38fd1498Szrj return __formatter; 493*38fd1498Szrj } 494*38fd1498Szrj }; 495*38fd1498Szrj } // namespace __gnu_debug 496*38fd1498Szrj 497*38fd1498Szrj #undef _GLIBCXX_TYPEID 498*38fd1498Szrj 499*38fd1498Szrj #endif 500