--- /dev/null
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// Copyright (C) 2011 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 <type_traits>
+#include <initializer_list>
+#include <testsuite_tr1.h>
+
+using namespace __gnu_test::assign;
+
+static_assert(std::is_assignable<int&, int>::value, "Error");
+static_assert(std::is_assignable<int&, const int>::value, "Error");
+static_assert(std::is_assignable<int&, int&>::value, "Error");
+static_assert(std::is_assignable<int&, const int&>::value, "Error");
+
+static_assert(!std::is_assignable<int, int>::value, "Error");
+static_assert(!std::is_assignable<int, const int>::value, "Error");
+static_assert(!std::is_assignable<int, int&>::value, "Error");
+static_assert(!std::is_assignable<int, const int&>::value, "Error");
+
+static_assert(!std::is_assignable<const int, int>::value, "Error");
+static_assert(!std::is_assignable<const int, const int>::value, "Error");
+static_assert(!std::is_assignable<const int, int&>::value, "Error");
+static_assert(!std::is_assignable<const int, const int&>::value, "Error");
+
+static_assert(!std::is_assignable<const int&, int>::value, "Error");
+static_assert(!std::is_assignable<const int&, const int>::value, "Error");
+static_assert(!std::is_assignable<const int&, int&>::value, "Error");
+static_assert(!std::is_assignable<const int&, const int&>::value, "Error");
+
+static_assert(std::is_assignable<Empty&, Empty>::value, "Error");
+static_assert(std::is_assignable<Empty&, const Empty>::value, "Error");
+static_assert(std::is_assignable<Empty&, Empty&>::value, "Error");
+static_assert(std::is_assignable<Empty&, const Empty&>::value, "Error");
+static_assert(std::is_assignable<Empty, Empty>::value, "Error");
+static_assert(std::is_assignable<Empty, const Empty>::value, "Error");
+static_assert(std::is_assignable<Empty, Empty&>::value, "Error");
+static_assert(std::is_assignable<Empty, const Empty&>::value, "Error");
+
+static_assert(std::is_assignable<B&, B>::value, "Error");
+static_assert(std::is_assignable<B&, const B>::value, "Error");
+static_assert(std::is_assignable<B&, B&>::value, "Error");
+static_assert(std::is_assignable<B&, const B&>::value, "Error");
+static_assert(std::is_assignable<B, B>::value, "Error");
+static_assert(std::is_assignable<B, const B>::value, "Error");
+static_assert(std::is_assignable<B, B&>::value, "Error");
+static_assert(std::is_assignable<B, const B&>::value, "Error");
+
+static_assert(std::is_assignable<bool&, bool>::value, "Error");
+static_assert(std::is_assignable<bool&, const bool>::value, "Error");
+static_assert(std::is_assignable<bool&, bool&>::value, "Error");
+static_assert(std::is_assignable<bool&, const bool&>::value, "Error");
+
+// bool is a fundamental type that does not allow assignment to an rvalue:
+static_assert(!std::is_assignable<bool, bool>::value, "Error");
+static_assert(!std::is_assignable<bool, const bool>::value, "Error");
+static_assert(!std::is_assignable<bool, bool&>::value, "Error");
+static_assert(!std::is_assignable<bool, const bool&>::value, "Error");
+
+static_assert(std::is_assignable<std::nullptr_t&,
+std::nullptr_t>::value, "Error");
+static_assert(std::is_assignable<std::nullptr_t&, const
+std::nullptr_t>::value, "Error");
+static_assert(std::is_assignable<std::nullptr_t&,
+std::nullptr_t&>::value, "Error");
+static_assert(std::is_assignable<std::nullptr_t&, const
+std::nullptr_t&>::value, "Error");
+
+// std::nullptr_t is a fundamental type that does not allow
+// assignment to an rvalue:
+static_assert(!std::is_assignable<std::nullptr_t,
+std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<std::nullptr_t, const
+std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<std::nullptr_t,
+std::nullptr_t&>::value, "Error");
+static_assert(!std::is_assignable<std::nullptr_t, const
+std::nullptr_t&>::value, "Error");
+
+static_assert(std::is_assignable<E&, E>::value, "Error");
+static_assert(std::is_assignable<E&, const E>::value, "Error");
+static_assert(std::is_assignable<E&, E&>::value, "Error");
+static_assert(std::is_assignable<E&, const E&>::value, "Error");
+
+static_assert(std::is_assignable<int&, E>::value, "Error");
+static_assert(std::is_assignable<int&, const E>::value, "Error");
+static_assert(std::is_assignable<int&, E&>::value, "Error");
+static_assert(std::is_assignable<int&, const E&>::value, "Error");
+
+static_assert(!std::is_assignable<E&, int>::value, "Error");
+static_assert(!std::is_assignable<E&, const int>::value, "Error");
+static_assert(!std::is_assignable<E&, int&>::value, "Error");
+static_assert(!std::is_assignable<E&, const int&>::value, "Error");
+
+static_assert(!std::is_assignable<E&, E2>::value, "Error");
+static_assert(!std::is_assignable<E&, const E2>::value, "Error");
+static_assert(!std::is_assignable<E&, E2&>::value, "Error");
+static_assert(!std::is_assignable<E&, const E2&>::value, "Error");
+
+// E is not a class type and thus does not allow assignment to an rvalue:
+static_assert(!std::is_assignable<E, E>::value, "Error");
+static_assert(!std::is_assignable<E, const E>::value, "Error");
+static_assert(!std::is_assignable<E, E&>::value, "Error");
+static_assert(!std::is_assignable<E, const E&>::value, "Error");
+
+static_assert(std::is_assignable<SE&, SE>::value, "Error");
+static_assert(std::is_assignable<SE&, const SE>::value, "Error");
+static_assert(std::is_assignable<SE&, SE&>::value, "Error");
+static_assert(std::is_assignable<SE&, const SE&>::value, "Error");
+
+static_assert(!std::is_assignable<int&, SE>::value, "Error");
+static_assert(!std::is_assignable<int&, const SE>::value, "Error");
+static_assert(!std::is_assignable<int&, SE&>::value, "Error");
+static_assert(!std::is_assignable<int&, const SE&>::value, "Error");
+
+static_assert(!std::is_assignable<SE&, int>::value, "Error");
+static_assert(!std::is_assignable<SE&, const int>::value, "Error");
+static_assert(!std::is_assignable<SE&, int&>::value, "Error");
+static_assert(!std::is_assignable<SE&, const int&>::value, "Error");
+
+// SE is not a class type and thus does not allow assignment to an rvalue:
+static_assert(!std::is_assignable<SE, SE>::value, "Error");
+static_assert(!std::is_assignable<SE, const SE>::value, "Error");
+static_assert(!std::is_assignable<SE, SE&>::value, "Error");
+static_assert(!std::is_assignable<SE, const SE&>::value, "Error");
+
+static_assert(std::is_assignable<AnyAssign&, int>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, std::nullptr_t>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, E>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, SE>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, Empty>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, U>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, int&>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, std::nullptr_t&>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, E&>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, SE&>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, Empty&>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, U&>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, AnyAssign>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&,
+std::initializer_list<int>>::value, "Error");
+
+static_assert(std::is_assignable<AnyAssign&, int[1]>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&,
+std::nullptr_t[1]>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, E[1]>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, SE[1]>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, int(&)[1]>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&,
+std::nullptr_t(&)[1]>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, E(&)[1]>::value, "Error");
+static_assert(std::is_assignable<AnyAssign&, SE(&)[1]>::value, "Error");
+
+static_assert(std::is_assignable<int&, E>::value, "Error");
+static_assert(!std::is_assignable<int&, SE>::value, "Error");
+static_assert(std::is_assignable<bool&, E>::value, "Error");
+static_assert(!std::is_assignable<bool&, SE>::value, "Error");
+static_assert(std::is_assignable<bool&, void*>::value, "Error");
+static_assert(std::is_assignable<bool&, int B::*>::value, "Error");
+static_assert(std::is_assignable<bool&, void*>::value, "Error");
+static_assert(std::is_assignable<bool&, std::nullptr_t>::value, "Error");
+
+static_assert(std::is_assignable<std::nullptr_t&,
+std::nullptr_t>::value, "Error");
+static_assert(std::is_assignable<void*&, std::nullptr_t>::value, "Error");
+static_assert(std::is_assignable<int*&, std::nullptr_t>::value, "Error");
+static_assert(std::is_assignable<int B::*&, std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<std::nullptr_t&, bool>::value, "Error");
+static_assert(!std::is_assignable<void*&, bool>::value, "Error");
+static_assert(!std::is_assignable<E&, bool>::value, "Error");
+static_assert(!std::is_assignable<SE&, bool>::value, "Error");
+
+static_assert(std::is_assignable<std::initializer_list<int>&,
+std::initializer_list<int>>::value, "Error");
+static_assert(std::is_assignable<std::initializer_list<int>&,
+std::initializer_list<int>&&>::value, "Error");
+static_assert(std::is_assignable<std::initializer_list<int>&, const
+std::initializer_list<int>&&>::value, "Error");
+static_assert(std::is_assignable<std::initializer_list<int>&,
+std::initializer_list<int>&>::value, "Error");
+static_assert(std::is_assignable<std::initializer_list<int>&, const
+std::initializer_list<int>&>::value, "Error");
+static_assert(!std::is_assignable<const std::initializer_list<int>&,
+std::initializer_list<int>>::value, "Error");
+
+static_assert(!std::is_assignable<const AnyAssign&, int>::value, "Error");
+static_assert(!std::is_assignable<AnyAssign&, void>::value, "Error");
+
+static_assert(!std::is_assignable<void, int>::value, "Error");
+static_assert(!std::is_assignable<const void, int>::value, "Error");
+static_assert(!std::is_assignable<int, void>::value, "Error");
+static_assert(!std::is_assignable<int, const void>::value, "Error");
+static_assert(!std::is_assignable<const int, void>::value, "Error");
+static_assert(!std::is_assignable<const int, const void>::value, "Error");
+static_assert(!std::is_assignable<int&, void>::value, "Error");
+static_assert(!std::is_assignable<int&, const void>::value, "Error");
+static_assert(!std::is_assignable<const int&, void>::value, "Error");
+static_assert(!std::is_assignable<const int&, const void>::value, "Error");
+static_assert(!std::is_assignable<void, void>::value, "Error");
+static_assert(!std::is_assignable<const void, void>::value, "Error");
+static_assert(!std::is_assignable<const void, const void>::value, "Error");
+
+static_assert(!std::is_assignable<int[1], int[1]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[1], int[1]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[1], int(&)[1]>::value, "Error");
+static_assert(!std::is_assignable<int[2], int[1]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[2], int[1]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[2], int(&)[1]>::value, "Error");
+static_assert(!std::is_assignable<int[1], void>::value, "Error");
+static_assert(!std::is_assignable<int(&)[1], void>::value, "Error");
+static_assert(!std::is_assignable<void, int[1]>::value, "Error");
+static_assert(!std::is_assignable<void, int(&)[1]>::value, "Error");
+
+static_assert(!std::is_assignable<int[], int[]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[], int[]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[], int(&)[]>::value, "Error");
+static_assert(!std::is_assignable<int[1], int[]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[1], int[]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[1], int(&)[]>::value, "Error");
+static_assert(!std::is_assignable<int[], int[1]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[], int[1]>::value, "Error");
+static_assert(!std::is_assignable<int(&)[], int(&)[1]>::value, "Error");
+static_assert(!std::is_assignable<int[], void>::value, "Error");
+static_assert(!std::is_assignable<int(&)[], void>::value, "Error");
+static_assert(!std::is_assignable<void, int[]>::value, "Error");
+static_assert(!std::is_assignable<void, int(&)[]>::value, "Error");
+
+static_assert(std::is_assignable<DelCopyAssign&,
+DelCopyAssign>::value, "Error");
+static_assert(!std::is_assignable<DelCopyAssign&, const
+DelCopyAssign>::value, "Error");
+static_assert(!std::is_assignable<DelCopyAssign&,
+DelCopyAssign&>::value, "Error");
+static_assert(!std::is_assignable<DelCopyAssign&, const
+DelCopyAssign&>::value, "Error");
+static_assert(!std::is_assignable<DelCopyAssign&, void>::value, "Error");
+static_assert(!std::is_assignable<DelCopyAssign&, void()>::value, "Error");
+static_assert(!std::is_assignable<DelCopyAssign&, void(&)()>::value, "Error");
+static_assert(!std::is_assignable<DelCopyAssign&, int>::value, "Error");
+
+static_assert(std::is_assignable<DelAnyAssign&,
+DelAnyAssign&&>::value, "Error");
+static_assert(std::is_assignable<DelAnyAssign&, const
+DelAnyAssign&>::value, "Error");
+static_assert(std::is_assignable<DelAnyAssign,
+DelAnyAssign&&>::value, "Error");
+static_assert(std::is_assignable<DelAnyAssign, const
+DelAnyAssign&>::value, "Error");
+
+static_assert(!std::is_assignable<const DelAnyAssign&,
+DelAnyAssign&&>::value, "Error");
+static_assert(!std::is_assignable<const DelAnyAssign&, const
+DelAnyAssign&>::value, "Error");
+static_assert(!std::is_assignable<const DelAnyAssign,
+DelAnyAssign&&>::value, "Error");
+static_assert(!std::is_assignable<const DelAnyAssign, const
+DelAnyAssign&>::value, "Error");
+
+static_assert(!std::is_assignable<DelAnyAssign&, int>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, int&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, const int&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, void>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, void()>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, void()
+const>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, void(&)()>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, void(&&)()>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&,
+std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&,
+std::nullptr_t&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&,
+std::initializer_list<int>>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&,
+std::initializer_list<int>&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, bool>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, bool&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, E>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, E&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, SE>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, SE&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, Empty>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, Empty&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, B>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, B&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, U>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, U&>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, void*>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, int*>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, B*>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, D*>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, int B::*>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, int D::*>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, int[]>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, int[1]>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, int(&)[]>::value, "Error");
+static_assert(!std::is_assignable<DelAnyAssign&, int(&)[1]>::value, "Error");
+
+static_assert(!std::is_assignable<void(), void>::value, "Error");
+static_assert(!std::is_assignable<void, void()>::value, "Error");
+static_assert(!std::is_assignable<void(), void()>::value, "Error");
+
+static_assert(!std::is_assignable<void(&)(), void>::value, "Error");
+static_assert(!std::is_assignable<void, void(&)()>::value, "Error");
+static_assert(!std::is_assignable<void(&)(), void(&)()>::value, "Error");
+static_assert(!std::is_assignable<void(&)(), void()>::value, "Error");
+static_assert(!std::is_assignable<void(), void(&)()>::value, "Error");
+
+static_assert(std::is_assignable<int&, ImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<int&, ExplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<int, ImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<int, ExplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<const int, ImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<const int, ExplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<const int&,
+ImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<const int&,
+ExplicitTo<int>>::value, "Error");
+
+static_assert(std::is_assignable<DelImplicitTo<int>&,
+DelImplicitTo<int>>::value, "Error");
+static_assert(std::is_assignable<DelImplicitTo<int>,
+DelImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<int&, DelImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<int, DelImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<const int&,
+DelImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<const int,
+DelImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<int&, DelExplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<int, DelExplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<const int&,
+DelExplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<const int,
+DelExplicitTo<int>>::value, "Error");
+
+static_assert(std::is_assignable<B&, B>::value, "Error");
+static_assert(std::is_assignable<B&, D>::value, "Error");
+static_assert(std::is_assignable<B&, B&>::value, "Error");
+static_assert(std::is_assignable<B&, D&>::value, "Error");
+static_assert(!std::is_assignable<const B&, B&>::value, "Error");
+static_assert(!std::is_assignable<const B&, D&>::value, "Error");
+static_assert(!std::is_assignable<D&, B>::value, "Error");
+static_assert(!std::is_assignable<D&, B&>::value, "Error");
+
+static_assert(std::is_assignable<B*&, B*>::value, "Error");
+static_assert(std::is_assignable<B*&, D*>::value, "Error");
+static_assert(std::is_assignable<const B*&, D*>::value, "Error");
+static_assert(std::is_assignable<const B*&, const D*>::value, "Error");
+static_assert(std::is_assignable<B*&, B*&>::value, "Error");
+static_assert(std::is_assignable<B*&, D*&>::value, "Error");
+static_assert(std::is_assignable<const B*&, B*&>::value, "Error");
+static_assert(std::is_assignable<const B*&, D*&>::value, "Error");
+static_assert(!std::is_assignable<B* const&, B*&>::value, "Error");
+static_assert(!std::is_assignable<B* const&, D*&>::value, "Error");
+static_assert(!std::is_assignable<D*&, B*>::value, "Error");
+static_assert(!std::is_assignable<D*&, B*&>::value, "Error");
+
+static_assert(std::is_assignable<MO&, MO>::value, "Error");
+static_assert(std::is_assignable<MO&, MO&&>::value, "Error");
+static_assert(std::is_assignable<MO, MO>::value, "Error");
+static_assert(std::is_assignable<MO, MO&&>::value, "Error");
+
+static_assert(!std::is_assignable<const MO&, MO>::value, "Error");
+static_assert(!std::is_assignable<const MO&, MO&&>::value, "Error");
+static_assert(!std::is_assignable<MO&, const MO&&>::value, "Error");
+static_assert(!std::is_assignable<MO&, MO&>::value, "Error");
+static_assert(!std::is_assignable<MO&, const MO&>::value, "Error");
+static_assert(!std::is_assignable<const MO, MO>::value, "Error");
+static_assert(!std::is_assignable<const MO, MO&&>::value, "Error");
+static_assert(!std::is_assignable<MO, const MO&&>::value, "Error");
+static_assert(!std::is_assignable<MO, MO&>::value, "Error");
+static_assert(!std::is_assignable<MO, const MO&>::value, "Error");
+
+static_assert(!std::is_assignable<NontrivialUnion&,
+NontrivialUnion>::value, "Error");
+static_assert(!std::is_assignable<NontrivialUnion&,
+NontrivialUnion&&>::value, "Error");
+static_assert(!std::is_assignable<NontrivialUnion&,
+NontrivialUnion&>::value, "Error");
+static_assert(!std::is_assignable<NontrivialUnion&, const
+NontrivialUnion&>::value, "Error");
+static_assert(!std::is_assignable<NontrivialUnion&, const
+NontrivialUnion&&>::value, "Error");
+
+static_assert(std::is_assignable<Abstract&, Abstract>::value, "Error");
+static_assert(std::is_assignable<Abstract&, Abstract&&>::value, "Error");
+static_assert(std::is_assignable<Abstract&, Abstract&>::value, "Error");
+static_assert(std::is_assignable<Abstract&, const Abstract&>::value, "Error");
+static_assert(std::is_assignable<Abstract&, const Abstract&&>::value, "Error");
+static_assert(std::is_assignable<Abstract&&, Abstract>::value, "Error");
+static_assert(std::is_assignable<Abstract&&, Abstract&&>::value, "Error");
+static_assert(std::is_assignable<Abstract&&, Abstract&>::value, "Error");
+static_assert(std::is_assignable<Abstract&&, const Abstract&>::value, "Error");
+static_assert(std::is_assignable<Abstract&&, const
+Abstract&&>::value, "Error");
+
+static_assert(std::is_assignable<AbstractDelDtor&,
+AbstractDelDtor>::value, "Error");
+static_assert(std::is_assignable<AbstractDelDtor&,
+AbstractDelDtor&&>::value, "Error");
+static_assert(std::is_assignable<AbstractDelDtor&,
+AbstractDelDtor&>::value, "Error");
+static_assert(std::is_assignable<AbstractDelDtor&, const
+AbstractDelDtor&>::value, "Error");
+static_assert(std::is_assignable<AbstractDelDtor&, const
+AbstractDelDtor&&>::value, "Error");
+static_assert(std::is_assignable<AbstractDelDtor&&,
+AbstractDelDtor>::value, "Error");
+static_assert(std::is_assignable<AbstractDelDtor&&,
+AbstractDelDtor&&>::value, "Error");
+static_assert(std::is_assignable<AbstractDelDtor&&,
+AbstractDelDtor&>::value, "Error");
+static_assert(std::is_assignable<AbstractDelDtor&&, const
+AbstractDelDtor&>::value, "Error");
+static_assert(std::is_assignable<AbstractDelDtor&&, const
+AbstractDelDtor&&>::value, "Error");
+
+static_assert(std::is_assignable<DelDef&, DelDef>::value, "Error");
+static_assert(std::is_assignable<DelDef&, DelDef&&>::value, "Error");
+static_assert(std::is_assignable<DelDef&, DelDef&>::value, "Error");
+static_assert(std::is_assignable<DelDef&, const DelDef&>::value, "Error");
+static_assert(std::is_assignable<DelDef&, const DelDef&&>::value, "Error");
+static_assert(std::is_assignable<DelDef&&, DelDef>::value, "Error");
+static_assert(std::is_assignable<DelDef&&, DelDef&&>::value, "Error");
+static_assert(std::is_assignable<DelDef&&, DelDef&>::value, "Error");
+static_assert(std::is_assignable<DelDef&&, const DelDef&>::value, "Error");
+static_assert(std::is_assignable<DelDef&&, const DelDef&&>::value, "Error");
+
+static_assert(std::is_assignable<Ellipsis&, Ellipsis>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const Ellipsis>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, Ellipsis&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const Ellipsis&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis, Ellipsis>::value, "Error");
+static_assert(std::is_assignable<Ellipsis, const Ellipsis>::value, "Error");
+static_assert(std::is_assignable<Ellipsis, Ellipsis&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis, const Ellipsis&>::value, "Error");
+
+static_assert(!std::is_assignable<Ellipsis&, void>::value, "Error");
+
+static_assert(std::is_assignable<Ellipsis&, int>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const int>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, int&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const int&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, Empty>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const Empty>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, Empty&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const Empty&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, E>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const E>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, E&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const E&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, SE>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const SE>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, SE&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const SE&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, bool>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const bool>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, bool&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const bool&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, std::nullptr_t>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const
+std::nullptr_t>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, std::nullptr_t&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const
+std::nullptr_t&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, void*>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const void*>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, void*&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, const void*&>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, void()>::value, "Error");
+static_assert(std::is_assignable<Ellipsis&, void(&)()>::value, "Error");
+
+static_assert(std::is_assignable<DelEllipsis&, DelEllipsis>::value, "Error");
+static_assert(std::is_assignable<DelEllipsis&, const
+DelEllipsis>::value, "Error");
+static_assert(std::is_assignable<DelEllipsis&, DelEllipsis&>::value, "Error");
+static_assert(std::is_assignable<DelEllipsis&, const
+DelEllipsis&>::value, "Error");
+static_assert(std::is_assignable<DelEllipsis, DelEllipsis>::value, "Error");
+static_assert(std::is_assignable<DelEllipsis, const
+DelEllipsis>::value, "Error");
+static_assert(std::is_assignable<DelEllipsis, DelEllipsis&>::value, "Error");
+static_assert(std::is_assignable<DelEllipsis, const
+DelEllipsis&>::value, "Error");
+
+static_assert(!std::is_assignable<DelEllipsis&, void>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, int>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const int>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, int&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const int&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, Empty>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const Empty>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, Empty&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const Empty&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, E>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const E>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, E&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const E&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, SE>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const SE>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, SE&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const SE&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, bool>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const bool>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, bool&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const bool&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&,
+std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const
+std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&,
+std::nullptr_t&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const
+std::nullptr_t&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, void*>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const void*>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, void*&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, const void*&>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, void()>::value, "Error");
+static_assert(!std::is_assignable<DelEllipsis&, void(&)()>::value, "Error");
+
+static_assert(std::is_assignable<FromArgs<int>&, int>::value, "Error");
+static_assert(std::is_assignable<FromArgs<int>&, const int>::value, "Error");
+static_assert(!std::is_assignable<FromArgs<int>&,
+ImplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<FromArgs<int>&, ImplicitTo<const
+int>>::value, "Error");
+static_assert(!std::is_assignable<FromArgs<int>&,
+ExplicitTo<int>>::value, "Error");
+static_assert(!std::is_assignable<FromArgs<int>&, ExplicitTo<const
+int>>::value, "Error");
+
+static_assert(!std::is_assignable<DelFromArgs<int>&, int>::value, "Error");
+static_assert(!std::is_assignable<DelFromArgs<int>&, const
+int>::value, "Error");
+
+static_assert(std::is_assignable<void(*&)(),
+ImplicitTo<void(*)()>>::value, "Error");
+static_assert(!std::is_assignable<void(*&)(),
+ExplicitTo<void(*)()>>::value, "Error");
+
+static_assert(std::is_assignable<UAssignAll&, UAssignAll>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, const
+UAssignAll>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, UAssignAll&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, const
+UAssignAll&>::value, "Error");
+
+static_assert(std::is_assignable<UAssignAll, UAssignAll>::value, "Error");
+static_assert(std::is_assignable<UAssignAll, const
+UAssignAll>::value, "Error");
+static_assert(std::is_assignable<UAssignAll, UAssignAll&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll, const
+UAssignAll&>::value, "Error");
+
+static_assert(!std::is_assignable<UAssignAll&, void>::value, "Error");
+static_assert(!std::is_assignable<const UAssignAll&, void>::value, "Error");
+static_assert(!std::is_assignable<const UAssignAll&,
+UAssignAll>::value, "Error");
+static_assert(!std::is_assignable<const UAssignAll&, const
+UAssignAll>::value, "Error");
+static_assert(!std::is_assignable<const UAssignAll&,
+UAssignAll&>::value, "Error");
+static_assert(!std::is_assignable<const UAssignAll&, const
+UAssignAll&>::value, "Error");
+
+static_assert(std::is_assignable<UAssignAll&, int>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, int&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, E>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, E&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, SE>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, SE&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, double>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, double&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, Empty>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, Empty&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, B>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, B&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, U>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, U&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, std::nullptr_t>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&,
+std::nullptr_t&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, void()>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, void(&)()>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, void() const>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, void(*)()>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, void(*&)()>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, int*>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, int*&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, void*>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, void*&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, const int*>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, const int*&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, const void*>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, const void*&>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, int[1]>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, int(&)[1]>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, int[]>::value, "Error");
+static_assert(std::is_assignable<UAssignAll&, int(&)[]>::value, "Error");
+
+static_assert(!std::is_assignable<UDelAssignAll&, int>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, int&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, E>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, E&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, SE>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, SE&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, double>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, double&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, Empty>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, Empty&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, B>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, B&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, U>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, U&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&,
+std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&,
+std::nullptr_t&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, void()>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, void(&)()>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, void()
+const>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, void(*)()>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, void(*&)()>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, int*>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, int*&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, void*>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, void*&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, const int*>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, const
+int*&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, const
+void*>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, const
+void*&>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, int[1]>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, int(&)[1]>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, int[]>::value, "Error");
+static_assert(!std::is_assignable<UDelAssignAll&, int(&)[]>::value, "Error");
+
+static_assert(!std::is_assignable<void(&)(), std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<std::nullptr_t, void(&)()>::value, "Error");
+static_assert(!std::is_assignable<void(&)(), int[]>::value, "Error");
+static_assert(!std::is_assignable<int[], void(&)()>::value, "Error");
+static_assert(!std::is_assignable<int[], std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<std::nullptr_t, int[]>::value, "Error");
+static_assert(!std::is_assignable<int[1], std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<std::nullptr_t, int[1]>::value, "Error");
+static_assert(!std::is_assignable<void, std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<std::nullptr_t, void>::value, "Error");
+static_assert(!std::is_assignable<const D&, B&>::value, "Error");
+static_assert(!std::is_assignable<const B&, B&>::value, "Error");
+
+static_assert(std::is_assignable<B&, const D&>::value, "Error");
+static_assert(std::is_assignable<B&, const B&>::value, "Error");
+static_assert(std::is_assignable<int&, const int&>::value, "Error");
+static_assert(std::is_assignable<int&, const double&>::value, "Error");