| // { dg-do run { target c++11 } } |
| // |
| // Copyright (C) 2011-2021 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 <tr2/type_traits> |
| #include <typeinfo> |
| #include <stdexcept> |
| |
| struct A { }; |
| struct B1 : virtual public A { }; |
| struct B2 : virtual public A { }; |
| struct C : public B1, public B2 { }; |
| |
| void test() |
| { |
| // 1 |
| { |
| typedef std::tr2::direct_bases<A>::type tl; |
| static_assert(tl::empty::value, "error"); |
| } |
| |
| // 2 |
| { |
| typedef std::tr2::direct_bases<B1>::type tl1; |
| typedef std::tr2::direct_bases<B2>::type tl2; |
| |
| // Sanity check w/ runtime. |
| bool eq = typeid(tl1) == typeid(tl2); |
| if (!eq) |
| throw std::logic_error("typelist not equal"); |
| |
| // Sanity check. |
| static_assert(tl1::empty::value != std::true_type::value, "!empty"); |
| static_assert(tl2::empty::value != std::true_type::value, "!empty"); |
| |
| typedef tl1::first::type tl1_first; |
| typedef tl1::rest::type tl1_rest; |
| typedef tl2::first::type tl2_first; |
| typedef tl2::rest::type tl2_rest; |
| |
| eq = typeid(tl1_first) == typeid(tl2_first); |
| if (!eq) |
| throw std::logic_error("base not equal"); |
| |
| static_assert(tl1_rest::empty::value == std::true_type::value, "empty"); |
| static_assert(tl2_rest::empty::value == std::true_type::value, "empty"); |
| } |
| |
| // 3 |
| { |
| typedef std::tr2::direct_bases<C>::type tl; |
| |
| // Sanity check. |
| static_assert(tl::empty::value != std::true_type::value, "!empty"); |
| |
| typedef tl::first::type tl1_first; |
| typedef tl::rest::type tl2; |
| typedef tl2::first::type tl2_first; |
| typedef tl2::rest::type tl3; |
| |
| bool eq = typeid(tl1_first) == typeid(tl2_first); |
| if (eq) |
| throw std::logic_error("bases are not equal"); |
| |
| static_assert(tl3::empty::value == std::true_type::value, "empty"); |
| } |
| |
| } |
| |
| int main() |
| { |
| test(); |
| return 0; |
| } |