Mercurial > hg > CbC > CbC_gcc
view libstdc++-v3/testsuite/util/testsuite_api.h @ 136:4627f235cf2a
fix c-next example
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 08 Nov 2018 14:11:56 +0900 |
parents | 84e7813d76e9 |
children | 1830386684a0 |
line wrap: on
line source
// -*- C++ -*- // Exception testing utils for the C++ library testsuite. // // Copyright (C) 2007-2018 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 // 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& lhs, const NonDefaultConstructible& rhs) { return NonDefaultConstructible(1); } inline NonDefaultConstructible operator-(const NonDefaultConstructible& lhs, const NonDefaultConstructible& rhs) { return NonDefaultConstructible(1); } inline NonDefaultConstructible operator*(const NonDefaultConstructible& lhs, const NonDefaultConstructible& rhs) { 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