]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/include/debug/formatter.h
aarch64: Update sizeless tests for recent GNU C changes
[thirdparty/gcc.git] / libstdc++-v3 / include / debug / formatter.h
CommitLineData
285b36d6
BK
1// Debug-mode error formatting implementation -*- C++ -*-
2
7adcbafe 3// Copyright (C) 2003-2022 Free Software Foundation, Inc.
285b36d6
BK
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
748086b7 8// Free Software Foundation; either version 3, or (at your option)
285b36d6
BK
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
748086b7
JJ
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
285b36d6 19
748086b7
JJ
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
285b36d6 24
78a53887
BK
25/** @file debug/formatter.h
26 * This file is a GNU debug extension to the Standard C++ Library.
27 */
28
285b36d6
BK
29#ifndef _GLIBCXX_DEBUG_FORMATTER_H
30#define _GLIBCXX_DEBUG_FORMATTER_H 1
31
b8add594 32#include <bits/c++config.h>
fa5cc2db
FD
33
34#if __cpp_rtti
35# include <typeinfo>
36# define _GLIBCXX_TYPEID(_Type) &typeid(_Type)
37#else
38namespace std
39{
40 class type_info;
41}
42# define _GLIBCXX_TYPEID(_Type) 0
43#endif
285b36d6 44
6c882d0f
FD
45#if __cplusplus >= 201103L
46namespace __gnu_cxx
47{
48_GLIBCXX_BEGIN_NAMESPACE_VERSION
49
50template<typename _Iterator, typename _Container>
51 class __normal_iterator;
52
53_GLIBCXX_END_NAMESPACE_VERSION
54}
55
56namespace std
57{
58_GLIBCXX_BEGIN_NAMESPACE_VERSION
59
60template<typename _Iterator>
61 class reverse_iterator;
62
63template<typename _Iterator>
64 class move_iterator;
65
66_GLIBCXX_END_NAMESPACE_VERSION
67}
68#endif
69
285b36d6
BK
70namespace __gnu_debug
71{
45f388bb
BK
72 using std::type_info;
73
1f5ca1a1 74 template<typename _Iterator>
38b17c27
FD
75 _GLIBCXX_CONSTEXPR
76 bool __check_singular(_Iterator const&);
1f5ca1a1 77
285b36d6
BK
78 class _Safe_sequence_base;
79
e9afbed0 80 template<typename _Iterator, typename _Sequence, typename _Category>
285b36d6
BK
81 class _Safe_iterator;
82
77e0bf4e
FD
83 template<typename _Iterator, typename _Sequence>
84 class _Safe_local_iterator;
85
526da49c 86 template<typename _Sequence>
285b36d6
BK
87 class _Safe_sequence;
88
89 enum _Debug_msg_id
90 {
91 // General checks
92 __msg_valid_range,
93 __msg_insert_singular,
94 __msg_insert_different,
95 __msg_erase_bad,
96 __msg_erase_different,
97 __msg_subscript_oob,
98 __msg_empty,
99 __msg_unpartitioned,
100 __msg_unpartitioned_pred,
101 __msg_unsorted,
102 __msg_unsorted_pred,
103 __msg_not_heap,
104 __msg_not_heap_pred,
105 // std::bitset checks
106 __msg_bad_bitset_write,
107 __msg_bad_bitset_read,
108 __msg_bad_bitset_flip,
109 // std::list checks
110 __msg_self_splice,
111 __msg_splice_alloc,
112 __msg_splice_bad,
113 __msg_splice_other,
114 __msg_splice_overlap,
115 // iterator checks
116 __msg_init_singular,
117 __msg_init_copy_singular,
118 __msg_init_const_singular,
119 __msg_copy_singular,
120 __msg_bad_deref,
121 __msg_bad_inc,
122 __msg_bad_dec,
123 __msg_iter_subscript_oob,
124 __msg_advance_oob,
125 __msg_retreat_oob,
126 __msg_iter_compare_bad,
127 __msg_compare_different,
128 __msg_iter_order_bad,
129 __msg_order_different,
130 __msg_distance_bad,
131 __msg_distance_different,
132 // istream_iterator
133 __msg_deref_istream,
134 __msg_inc_istream,
135 // ostream_iterator
136 __msg_output_ostream,
137 // istreambuf_iterator
138 __msg_deref_istreambuf,
b8b4301e
PC
139 __msg_inc_istreambuf,
140 // forward_list
141 __msg_insert_after_end,
142 __msg_erase_after_bad,
77e0bf4e 143 __msg_valid_range2,
7181e991 144 // unordered container local iterators
a8028a3e 145 __msg_local_iter_compare_bad,
739fd6a6 146 __msg_non_empty_range,
c2fb0a1a 147 // self move assign (no longer used)
7181e991
FD
148 __msg_self_move_assign,
149 // unordered container buckets
14cbb5d8 150 __msg_bucket_index_oob,
e77c9aed 151 __msg_valid_load_factor,
5720787a
FD
152 // others
153 __msg_equal_allocs,
630a286a
FD
154 __msg_insert_range_from_self,
155 __msg_irreflexive_ordering
285b36d6
BK
156 };
157
158 class _Error_formatter
159 {
814e52ca
FD
160 // Tags denoting the type of parameter for construction
161 struct _Is_iterator { };
162 struct _Is_iterator_value_type { };
163 struct _Is_sequence { };
164 struct _Is_instance { };
165
166 public:
285b36d6
BK
167 /// Whether an iterator is constant, mutable, or unknown
168 enum _Constness
169 {
170 __unknown_constness,
171 __const_iterator,
172 __mutable_iterator,
173 __last_constness
526da49c 174 };
285b36d6
BK
175
176 // The state of the iterator (fine-grained), if we know it.
177 enum _Iterator_state
178 {
179 __unknown_state,
fa5cc2db
FD
180 __singular, // singular, may still be attached to a sequence
181 __begin, // dereferenceable, and at the beginning
182 __middle, // dereferenceable, not at the beginning
183 __end, // past-the-end, may be at beginning if sequence empty
184 __before_begin, // before begin
6c882d0f
FD
185 __rbegin, // dereferenceable, and at the reverse-beginning
186 __rmiddle, // reverse-dereferenceable, not at the reverse-beginning
187 __rend, // reverse-past-the-end
01b1afdc 188 __singular_value_init, // singular, value initialized
285b36d6
BK
189 __last_state
190 };
191
285b36d6
BK
192 // A parameter that may be referenced by an error message
193 struct _Parameter
194 {
526da49c
BI
195 enum
196 {
197 __unused_param,
198 __iterator,
199 __sequence,
285b36d6 200 __integer,
adad2a7d
FD
201 __string,
202 __instance,
203 __iterator_value_type
285b36d6 204 } _M_kind;
526da49c 205
a42220f0 206 struct _Named
adad2a7d
FD
207 {
208 const char* _M_name;
a42220f0
FD
209 };
210
211 struct _Type : _Named
212 {
adad2a7d
FD
213 const type_info* _M_type;
214 };
215
216 struct _Instance : _Type
217 {
218 const void* _M_address;
219 };
220
285b36d6
BK
221 union
222 {
223 // When _M_kind == __iterator
adad2a7d 224 struct : _Instance
285b36d6 225 {
fa5cc2db
FD
226 _Constness _M_constness;
227 _Iterator_state _M_state;
228 const void* _M_sequence;
229 const type_info* _M_seq_type;
285b36d6 230 } _M_iterator;
526da49c 231
285b36d6 232 // When _M_kind == __sequence
adad2a7d 233 _Instance _M_sequence;
285b36d6
BK
234
235 // When _M_kind == __integer
a42220f0 236 struct : _Named
285b36d6 237 {
fa5cc2db 238 long _M_value;
285b36d6
BK
239 } _M_integer;
240
241 // When _M_kind == __string
a42220f0 242 struct : _Named
285b36d6 243 {
fa5cc2db 244 const char* _M_value;
285b36d6 245 } _M_string;
adad2a7d
FD
246
247 // When _M_kind == __instance
248 _Instance _M_instance;
249
250 // When _M_kind == __iterator_value_type
251 _Type _M_iterator_value_type;
285b36d6
BK
252 } _M_variant;
253
26c691a8 254 _Parameter() : _M_kind(__unused_param), _M_variant() { }
526da49c 255
fa5cc2db 256 _Parameter(long __value, const char* __name)
26c691a8 257 : _M_kind(__integer), _M_variant()
526da49c 258 {
285b36d6 259 _M_variant._M_integer._M_name = __name;
526da49c 260 _M_variant._M_integer._M_value = __value;
285b36d6
BK
261 }
262
fa5cc2db 263 _Parameter(const char* __value, const char* __name)
26c691a8 264 : _M_kind(__string), _M_variant()
285b36d6
BK
265 {
266 _M_variant._M_string._M_name = __name;
526da49c 267 _M_variant._M_string._M_value = __value;
285b36d6
BK
268 }
269
e9afbed0
FD
270 template<typename _Iterator, typename _Sequence, typename _Category>
271 _Parameter(_Safe_iterator<_Iterator, _Sequence, _Category> const& __it,
285b36d6 272 const char* __name, _Is_iterator)
26c691a8 273 : _M_kind(__iterator), _M_variant()
fa5cc2db 274 {
285b36d6 275 _M_variant._M_iterator._M_name = __name;
200fcd33 276 _M_variant._M_iterator._M_address = std::__addressof(__it);
6c882d0f 277 _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(_Iterator);
526da49c 278 _M_variant._M_iterator._M_constness =
6c882d0f 279 __it._S_constant() ? __const_iterator : __mutable_iterator;
285b36d6 280 _M_variant._M_iterator._M_sequence = __it._M_get_sequence();
fa5cc2db 281 _M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence);
285b36d6
BK
282
283 if (__it._M_singular())
01b1afdc
FD
284 {
285 if (__it._M_value_initialized())
286 _M_variant._M_iterator._M_state = __singular_value_init;
287 else
288 _M_variant._M_iterator._M_state = __singular;
289 }
285b36d6
BK
290 else
291 {
b8b4301e
PC
292 if (__it._M_is_before_begin())
293 _M_variant._M_iterator._M_state = __before_begin;
294 else if (__it._M_is_end())
285b36d6 295 _M_variant._M_iterator._M_state = __end;
b8b4301e 296 else if (__it._M_is_begin())
285b36d6
BK
297 _M_variant._M_iterator._M_state = __begin;
298 else
299 _M_variant._M_iterator._M_state = __middle;
300 }
301 }
302
77e0bf4e 303 template<typename _Iterator, typename _Sequence>
adad2a7d 304 _Parameter(_Safe_local_iterator<_Iterator, _Sequence> const& __it,
77e0bf4e
FD
305 const char* __name, _Is_iterator)
306 : _M_kind(__iterator), _M_variant()
307 {
308 _M_variant._M_iterator._M_name = __name;
200fcd33 309 _M_variant._M_iterator._M_address = std::__addressof(__it);
6c882d0f 310 _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(_Iterator);
77e0bf4e 311 _M_variant._M_iterator._M_constness =
6c882d0f 312 __it._S_constant() ? __const_iterator : __mutable_iterator;
77e0bf4e 313 _M_variant._M_iterator._M_sequence = __it._M_get_sequence();
fa5cc2db 314 _M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence);
77e0bf4e
FD
315
316 if (__it._M_singular())
01b1afdc
FD
317 {
318 if (__it._M_value_initialized())
319 _M_variant._M_iterator._M_state = __singular_value_init;
320 else
321 _M_variant._M_iterator._M_state = __singular;
322 }
77e0bf4e
FD
323 else
324 {
325 if (__it._M_is_end())
326 _M_variant._M_iterator._M_state = __end;
327 else if (__it._M_is_begin())
328 _M_variant._M_iterator._M_state = __begin;
329 else
330 _M_variant._M_iterator._M_state = __middle;
331 }
332 }
333
285b36d6 334 template<typename _Type>
adad2a7d 335 _Parameter(const _Type* const& __it, const char* __name, _Is_iterator)
fa5cc2db
FD
336 : _M_kind(__iterator), _M_variant()
337 {
285b36d6 338 _M_variant._M_iterator._M_name = __name;
200fcd33 339 _M_variant._M_iterator._M_address = std::__addressof(__it);
fa5cc2db 340 _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
adad2a7d
FD
341 _M_variant._M_iterator._M_constness = __const_iterator;
342 _M_variant._M_iterator._M_state = __it ? __unknown_state : __singular;
285b36d6
BK
343 _M_variant._M_iterator._M_sequence = 0;
344 _M_variant._M_iterator._M_seq_type = 0;
345 }
346
347 template<typename _Type>
adad2a7d 348 _Parameter(_Type* const& __it, const char* __name, _Is_iterator)
fa5cc2db
FD
349 : _M_kind(__iterator), _M_variant()
350 {
285b36d6 351 _M_variant._M_iterator._M_name = __name;
200fcd33 352 _M_variant._M_iterator._M_address = std::__addressof(__it);
fa5cc2db 353 _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
adad2a7d
FD
354 _M_variant._M_iterator._M_constness = __mutable_iterator;
355 _M_variant._M_iterator._M_state = __it ? __unknown_state : __singular;
285b36d6
BK
356 _M_variant._M_iterator._M_sequence = 0;
357 _M_variant._M_iterator._M_seq_type = 0;
358 }
526da49c 359
285b36d6 360 template<typename _Iterator>
adad2a7d 361 _Parameter(_Iterator const& __it, const char* __name, _Is_iterator)
fa5cc2db
FD
362 : _M_kind(__iterator), _M_variant()
363 {
285b36d6 364 _M_variant._M_iterator._M_name = __name;
200fcd33 365 _M_variant._M_iterator._M_address = std::__addressof(__it);
fa5cc2db 366 _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
285b36d6 367 _M_variant._M_iterator._M_constness = __unknown_constness;
526da49c 368 _M_variant._M_iterator._M_state =
adad2a7d 369 __gnu_debug::__check_singular(__it) ? __singular : __unknown_state;
285b36d6
BK
370 _M_variant._M_iterator._M_sequence = 0;
371 _M_variant._M_iterator._M_seq_type = 0;
372 }
373
6c882d0f
FD
374#if __cplusplus >= 201103L
375 // The following constructors are only defined in C++11 to take
376 // advantage of the constructor delegation feature.
377 template<typename _Iterator, typename _Container>
378 _Parameter(
379 __gnu_cxx::__normal_iterator<_Iterator, _Container> const& __it,
380 const char* __name, _Is_iterator)
381 : _Parameter(__it.base(), __name, _Is_iterator{})
382 { _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it); }
383
384 template<typename _Iterator>
385 _Parameter(std::reverse_iterator<_Iterator> const& __it,
386 const char* __name, _Is_iterator)
387 : _Parameter(__it.base(), __name, _Is_iterator{})
388 {
389 _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
390 _M_variant._M_iterator._M_state
391 = _S_reverse_state(_M_variant._M_iterator._M_state);
392 }
393
e9afbed0
FD
394 template<typename _Iterator, typename _Sequence, typename _Category>
395 _Parameter(std::reverse_iterator<_Safe_iterator<_Iterator, _Sequence,
396 _Category>> const& __it,
397 const char* __name, _Is_iterator)
6c882d0f
FD
398 : _Parameter(__it.base(), __name, _Is_iterator{})
399 {
400 _M_variant._M_iterator._M_type
401 = _GLIBCXX_TYPEID(std::reverse_iterator<_Iterator>);
402 _M_variant._M_iterator._M_state
403 = _S_reverse_state(_M_variant._M_iterator._M_state);
404 }
405
406 template<typename _Iterator>
407 _Parameter(std::move_iterator<_Iterator> const& __it,
408 const char* __name, _Is_iterator)
409 : _Parameter(__it.base(), __name, _Is_iterator{})
410 { _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it); }
411
e9afbed0
FD
412 template<typename _Iterator, typename _Sequence, typename _Category>
413 _Parameter(std::move_iterator<_Safe_iterator<_Iterator, _Sequence,
414 _Category>> const& __it,
415 const char* __name, _Is_iterator)
6c882d0f
FD
416 : _Parameter(__it.base(), __name, _Is_iterator{})
417 {
418 _M_variant._M_iterator._M_type
419 = _GLIBCXX_TYPEID(std::move_iterator<_Iterator>);
420 }
421
422 private:
423 _Iterator_state
424 _S_reverse_state(_Iterator_state __state)
425 {
426 switch (__state)
427 {
428 case __begin:
429 return __rend;
430 case __middle:
431 return __rmiddle;
432 case __end:
433 return __rbegin;
434 default:
435 return __state;
436 }
437 }
438
439 public:
440#endif
441
285b36d6 442 template<typename _Sequence>
fa5cc2db 443 _Parameter(const _Safe_sequence<_Sequence>& __seq,
285b36d6 444 const char* __name, _Is_sequence)
fa5cc2db
FD
445 : _M_kind(__sequence), _M_variant()
446 {
285b36d6 447 _M_variant._M_sequence._M_name = __name;
526da49c 448 _M_variant._M_sequence._M_address =
200fcd33 449 static_cast<const _Sequence*>(std::__addressof(__seq));
fa5cc2db 450 _M_variant._M_sequence._M_type = _GLIBCXX_TYPEID(_Sequence);
285b36d6
BK
451 }
452
453 template<typename _Sequence>
fa5cc2db
FD
454 _Parameter(const _Sequence& __seq, const char* __name, _Is_sequence)
455 : _M_kind(__sequence), _M_variant()
456 {
285b36d6 457 _M_variant._M_sequence._M_name = __name;
200fcd33 458 _M_variant._M_sequence._M_address = std::__addressof(__seq);
fa5cc2db 459 _M_variant._M_sequence._M_type = _GLIBCXX_TYPEID(_Sequence);
285b36d6 460 }
526da49c 461
adad2a7d
FD
462 template<typename _Iterator>
463 _Parameter(const _Iterator& __it, const char* __name,
464 _Is_iterator_value_type)
465 : _M_kind(__iterator_value_type), _M_variant()
466 {
467 _M_variant._M_iterator_value_type._M_name = __name;
468 _M_variant._M_iterator_value_type._M_type =
469 _GLIBCXX_TYPEID(typename std::iterator_traits<_Iterator>::value_type);
470 }
471
472 template<typename _Type>
473 _Parameter(const _Type& __inst, const char* __name, _Is_instance)
474 : _M_kind(__instance), _M_variant()
475 {
476 _M_variant._M_instance._M_name = __name;
477 _M_variant._M_instance._M_address = &__inst;
478 _M_variant._M_instance._M_type = _GLIBCXX_TYPEID(_Type);
479 }
480
dc4dd7f6 481#if !_GLIBCXX_INLINE_VERSION
285b36d6 482 void
526da49c 483 _M_print_field(const _Error_formatter* __formatter,
814e52ca 484 const char* __name) const _GLIBCXX_DEPRECATED;
526da49c 485
285b36d6 486 void
814e52ca
FD
487 _M_print_description(const _Error_formatter* __formatter)
488 const _GLIBCXX_DEPRECATED;
dc4dd7f6 489#endif
285b36d6
BK
490 };
491
285b36d6 492 template<typename _Iterator>
814e52ca
FD
493 _Error_formatter&
494 _M_iterator(const _Iterator& __it, const char* __name = 0)
285b36d6 495 {
8fc81078 496 if (_M_num_parameters < std::size_t(__max_parameters))
285b36d6
BK
497 _M_parameters[_M_num_parameters++] = _Parameter(__it, __name,
498 _Is_iterator());
499 return *this;
500 }
501
adad2a7d 502 template<typename _Iterator>
814e52ca 503 _Error_formatter&
adad2a7d 504 _M_iterator_value_type(const _Iterator& __it,
814e52ca 505 const char* __name = 0)
adad2a7d 506 {
814e52ca 507 if (_M_num_parameters < __max_parameters)
adad2a7d
FD
508 _M_parameters[_M_num_parameters++] =
509 _Parameter(__it, __name, _Is_iterator_value_type());
510 return *this;
511 }
512
814e52ca
FD
513 _Error_formatter&
514 _M_integer(long __value, const char* __name = 0)
285b36d6 515 {
814e52ca 516 if (_M_num_parameters < __max_parameters)
285b36d6
BK
517 _M_parameters[_M_num_parameters++] = _Parameter(__value, __name);
518 return *this;
519 }
520
814e52ca
FD
521 _Error_formatter&
522 _M_string(const char* __value, const char* __name = 0)
285b36d6 523 {
814e52ca 524 if (_M_num_parameters < __max_parameters)
285b36d6
BK
525 _M_parameters[_M_num_parameters++] = _Parameter(__value, __name);
526 return *this;
527 }
528
529 template<typename _Sequence>
814e52ca
FD
530 _Error_formatter&
531 _M_sequence(const _Sequence& __seq, const char* __name = 0)
285b36d6 532 {
814e52ca 533 if (_M_num_parameters < __max_parameters)
526da49c 534 _M_parameters[_M_num_parameters++] = _Parameter(__seq, __name,
285b36d6
BK
535 _Is_sequence());
536 return *this;
537 }
538
adad2a7d 539 template<typename _Type>
814e52ca
FD
540 _Error_formatter&
541 _M_instance(const _Type& __inst, const char* __name = 0)
adad2a7d 542 {
814e52ca 543 if (_M_num_parameters < __max_parameters)
adad2a7d
FD
544 _M_parameters[_M_num_parameters++] = _Parameter(__inst, __name,
545 _Is_instance());
546 return *this;
547 }
548
814e52ca
FD
549 _Error_formatter&
550 _M_message(const char* __text)
285b36d6
BK
551 { _M_text = __text; return *this; }
552
814e52ca
FD
553 // Kept const qualifier for backward compatibility, to keep the same
554 // exported symbol.
555 _Error_formatter&
5d51b87a 556 _M_message(_Debug_msg_id __id) const throw ();
285b36d6 557
b8add594 558 _GLIBCXX_NORETURN void
285b36d6
BK
559 _M_error() const;
560
dc4dd7f6 561#if !_GLIBCXX_INLINE_VERSION
9dc420e6 562 template<typename _Tp>
4be58168 563 void
814e52ca
FD
564 _M_format_word(char*, int, const char*, _Tp)
565 const throw () _GLIBCXX_DEPRECATED;
4be58168 566
526da49c 567 void
814e52ca 568 _M_print_word(const char* __word) const _GLIBCXX_DEPRECATED;
285b36d6 569
526da49c 570 void
814e52ca 571 _M_print_string(const char* __string) const _GLIBCXX_DEPRECATED;
dc4dd7f6 572#endif
285b36d6 573
adad2a7d 574 private:
a5277405
FD
575 _Error_formatter(const char* __file, unsigned int __line,
576 const char* __function)
814e52ca 577 : _M_file(__file), _M_line(__line), _M_num_parameters(0), _M_text(0)
a5277405 578 , _M_function(__function)
814e52ca 579 { }
fa5cc2db 580
dc4dd7f6 581#if !_GLIBCXX_INLINE_VERSION
5dddb7e5 582 void
814e52ca 583 _M_get_max_length() const throw () _GLIBCXX_DEPRECATED;
dc4dd7f6 584#endif
5dddb7e5 585
285b36d6
BK
586 enum { __max_parameters = 9 };
587
fa5cc2db 588 const char* _M_file;
814e52ca
FD
589 unsigned int _M_line;
590 _Parameter _M_parameters[__max_parameters];
591 unsigned int _M_num_parameters;
592 const char* _M_text;
a5277405 593 const char* _M_function;
285b36d6
BK
594
595 public:
814e52ca 596 static _Error_formatter&
a5277405 597 _S_at(const char* __file, unsigned int __line, const char* __function)
814e52ca 598 {
a5277405 599 static _Error_formatter __formatter(__file, __line, __function);
814e52ca
FD
600 return __formatter;
601 }
285b36d6
BK
602 };
603} // namespace __gnu_debug
604
fa5cc2db
FD
605#undef _GLIBCXX_TYPEID
606
526da49c 607#endif