// { dg-options "-std=gnu++0x" }
//
// Copyright (C) 2011-2013 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()
{
  bool test __attribute__((unused)) = true;

  // 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;
}
