123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- // -*- C++ -*-
- // Exception testing utils for the C++ library testsuite.
- //
- // Copyright (C) 2007-2022 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
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 3, or (at your option)
- // any later version.
- //
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this library; see the file COPYING3. If not see
- // <http://www.gnu.org/licenses/>.
- //
- #include <exception>
- #include <testsuite_hooks.h>
- #ifndef _TESTSUITE_API
- #define _TESTSUITE_API 1
- namespace __gnu_test
- {
- // Checks for virtual public derivation in exception classes.
- // See:
- // http://www.boost.org/more/error_handling.html
- struct bad_non_virtual : virtual public std::exception { };
- template<typename Exception, bool DefaultCons>
- struct diamond_derivation_base;
- template<typename Exception>
- struct diamond_derivation_base<Exception, true>
- {
- struct diamond_derivation_error
- : bad_non_virtual, Exception
- {
- diamond_derivation_error()
- : bad_non_virtual(), Exception() { }
- };
- };
- template<typename Exception>
- struct diamond_derivation_base<Exception, false>
- {
- struct diamond_derivation_error
- : bad_non_virtual, Exception
- {
- diamond_derivation_error()
- : bad_non_virtual(), Exception("construct diamond") { }
- };
- };
- template<typename Exception, bool DefaultCons>
- struct diamond_derivation
- : diamond_derivation_base<Exception, DefaultCons>
- {
- typedef diamond_derivation_base<Exception, DefaultCons> base_type;
- typedef typename base_type::diamond_derivation_error error_type;
- // NB: In the libstdc++-v3 testsuite, all the standard exception
- // classes (+ a couple of extensions) are checked: since they
- // all derive *non* virtually from std::exception, the expected
- // behavior is ambiguity.
- static void test()
- {
- try
- { throw error_type(); }
- catch (std::exception const&)
- { VERIFY( false ); }
- catch (...)
- { VERIFY( true ); }
- }
- };
- // Testing type requirements for template arguments.
- struct NonDefaultConstructible
- {
- NonDefaultConstructible(int) { }
- NonDefaultConstructible(const NonDefaultConstructible&) { }
- #if __cplusplus >= 201103L
- NonDefaultConstructible&
- operator=(const NonDefaultConstructible&) = default;
- // For std::iota.
- NonDefaultConstructible&
- operator++()
- { return *this; }
- #endif
- };
- // See: 20.1.1 Template argument requirements.
- inline bool
- operator==(const NonDefaultConstructible&, const NonDefaultConstructible&)
- { return false; }
- inline bool
- operator<(const NonDefaultConstructible&, const NonDefaultConstructible&)
- { return false; }
- // For 23 unordered_* requirements.
- struct NonDefaultConstructible_hash
- {
- std::size_t
- operator()(NonDefaultConstructible) const
- { return 1; }
- };
- // For 26 numeric algorithms requirements, need addable,
- // subtractable, multiplicable.
- inline NonDefaultConstructible
- operator+(const NonDefaultConstructible&, const NonDefaultConstructible&)
- { return NonDefaultConstructible(1); }
- inline NonDefaultConstructible
- operator-(const NonDefaultConstructible&, const NonDefaultConstructible&)
- { return NonDefaultConstructible(1); }
- inline NonDefaultConstructible
- operator*(const NonDefaultConstructible&, const NonDefaultConstructible&)
- { return NonDefaultConstructible(1); }
- // Like unary_function, but takes no argument. (ie, void).
- // Used for generator template parameter.
- template<typename _Result>
- struct void_function
- {
- typedef _Result result_type;
- result_type
- operator()() const
- { return result_type(); }
- };
- template<>
- struct void_function<NonDefaultConstructible>
- {
- typedef NonDefaultConstructible result_type;
- result_type
- operator()() const
- { return result_type(2); }
- };
- // For std::addressof, etc.
- struct OverloadedAddressAux { };
- struct OverloadedAddress
- {
- OverloadedAddressAux
- operator&() const { return OverloadedAddressAux(); }
- };
- inline bool
- operator<(const OverloadedAddress&, const OverloadedAddress&)
- { return false; }
- inline bool
- operator==(const OverloadedAddress&, const OverloadedAddress&)
- { return false; }
- struct OverloadedAddress_hash
- {
- std::size_t
- operator()(const OverloadedAddress&) const
- { return 1; }
- };
- #if __cplusplus >= 201103L
- struct NonCopyConstructible
- {
- NonCopyConstructible() : num(-1) { }
- NonCopyConstructible(NonCopyConstructible&& other)
- : num(other.num)
- { other.num = 0; }
- NonCopyConstructible(const NonCopyConstructible&) = delete;
- operator int() { return num; }
- private:
- int num;
- };
- #endif
- }
- #endif
|