// Copyright (C) 2015-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
// .
// { dg-do compile { target c++11 } }
#include
#include
template
struct Alloc : Base
{
typedef T value_type;
Alloc();
template
Alloc(const Alloc&);
T* allocate(std::size_t);
void deallocate(T*, std::size_t);
};
template struct Empty { };
template<> struct Empty { int x; };
template
struct WithType
{ using is_always_equal = std::integral_constant; };
struct EmptyAndTrue : Empty, WithType { };
struct EmptyButFalse : Empty, WithType { };
struct NotEmptyButTrue : Empty, WithType { };
struct NotEmptyAndFalse : Empty, WithType { };
template
constexpr bool test()
{
using traits = std::allocator_traits>;
using test_type = typename traits::is_always_equal;
static_assert(std::is_base_of::value
|| std::is_base_of::value,
"has correct base characteristic");
return test_type::value;
}
static_assert( test>(), "empty type is always equal" );
static_assert( !test>(), "non-empty type is not always equal" );
static_assert( test(), "nested type is used" );
static_assert( !test(), "nested type is used" );
static_assert( test(), "nested type is used" );
static_assert( !test(), "nested type is used" );