2 // Exception testing utils for the C++ library testsuite.
4 // Copyright (C) 2007-2017 Free Software Foundation, Inc.
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING3. If not see
19 // <http://www.gnu.org/licenses/>.
23 #include <testsuite_hooks.h>
25 #ifndef _TESTSUITE_API
26 #define _TESTSUITE_API 1
30 // Checks for virtual public derivation in exception classes.
32 // http://www.boost.org/more/error_handling.html
33 struct bad_non_virtual
: virtual public std::exception
{ };
35 template<typename Exception
, bool DefaultCons
>
36 struct diamond_derivation_base
;
38 template<typename Exception
>
39 struct diamond_derivation_base
<Exception
, true>
41 struct diamond_derivation_error
42 : bad_non_virtual
, Exception
44 diamond_derivation_error()
45 : bad_non_virtual(), Exception() { }
49 template<typename Exception
>
50 struct diamond_derivation_base
<Exception
, false>
52 struct diamond_derivation_error
53 : bad_non_virtual
, Exception
55 diamond_derivation_error()
56 : bad_non_virtual(), Exception("construct diamond") { }
60 template<typename Exception
, bool DefaultCons
>
61 struct diamond_derivation
62 : diamond_derivation_base
<Exception
, DefaultCons
>
64 typedef diamond_derivation_base
<Exception
, DefaultCons
> base_type
;
65 typedef typename
base_type::diamond_derivation_error error_type
;
67 // NB: In the libstdc++-v3 testsuite, all the standard exception
68 // classes (+ a couple of extensions) are checked: since they
69 // all derive *non* virtually from std::exception, the expected
70 // behavior is ambiguity.
74 { throw error_type(); }
75 catch (std::exception
const&)
82 // Testing type requirements for template arguments.
83 struct NonDefaultConstructible
85 NonDefaultConstructible(int) { }
86 NonDefaultConstructible(const NonDefaultConstructible
&) { }
88 #if __cplusplus >= 201103L
90 NonDefaultConstructible
&
96 // See: 20.1.1 Template argument requirements.
98 operator==(const NonDefaultConstructible
&, const NonDefaultConstructible
&)
102 operator<(const NonDefaultConstructible
&, const NonDefaultConstructible
&)
105 // For 23 unordered_* requirements.
106 struct NonDefaultConstructible_hash
109 operator()(NonDefaultConstructible
) const
113 // For 26 numeric algorithms requirements, need addable,
114 // subtractable, multiplicable.
115 inline NonDefaultConstructible
116 operator+(const NonDefaultConstructible
& lhs
,
117 const NonDefaultConstructible
& rhs
)
118 { return NonDefaultConstructible(1); }
120 inline NonDefaultConstructible
121 operator-(const NonDefaultConstructible
& lhs
,
122 const NonDefaultConstructible
& rhs
)
123 { return NonDefaultConstructible(1); }
125 inline NonDefaultConstructible
126 operator*(const NonDefaultConstructible
& lhs
,
127 const NonDefaultConstructible
& rhs
)
128 { return NonDefaultConstructible(1); }
130 // Like unary_function, but takes no argument. (ie, void).
131 // Used for generator template parameter.
132 template<typename _Result
>
135 typedef _Result result_type
;
139 { return result_type(); }
143 struct void_function
<NonDefaultConstructible
>
145 typedef NonDefaultConstructible result_type
;
149 { return result_type(2); }
152 // For std::addressof, etc.
153 struct OverloadedAddressAux
{ };
155 struct OverloadedAddress
158 operator&() const { return OverloadedAddressAux(); }
162 operator<(const OverloadedAddress
&, const OverloadedAddress
&)
166 operator==(const OverloadedAddress
&, const OverloadedAddress
&)
169 struct OverloadedAddress_hash
172 operator()(const OverloadedAddress
&) const
176 #if __cplusplus >= 201103L
177 struct NonCopyConstructible
179 NonCopyConstructible() : num(-1) { }
181 NonCopyConstructible(NonCopyConstructible
&& other
)
185 NonCopyConstructible(const NonCopyConstructible
&) = delete;
187 operator int() { return num
; }