1 // { dg-options "-std=gnu++0x" }
4 // Copyright (C) 2013 Free Software Foundation, Inc.
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING3. If not see
19 // <http://www.gnu.org/licenses/>.
23 #include <unordered_set>
29 MoveOnly(MoveOnly
&&) = default;
33 bool operator()(const MoveOnly
&, const MoveOnly
) const { return true; }
36 std::size_t operator()(const MoveOnly
&) const { return 0; }
39 template<typename Alloc
>
40 using test_type
= std::unordered_set
<MoveOnly
, hash
, equal
, Alloc
>;
44 typedef test_type
<std::allocator
<MoveOnly
>> uim
;
46 v
.emplace_back(uim());
49 // Unordered containers don't use allocator_traits yet so need full
50 // Allocator interface, derive from std::allocator to get it.
51 template<typename T
, bool R
>
52 struct Alloc
: std::allocator
<T
>
55 struct rebind
{ typedef Alloc
<U
, R
> other
; };
60 Alloc(const Alloc
<U
, R
>&) { }
62 typedef typename
std::conditional
<R
, T
&&, const T
&>::type arg_type
;
64 void construct(T
* p
, arg_type
) const
65 { new((void*)p
) T(); }
68 // verify is_copy_constructible depends on allocator
69 typedef test_type
<Alloc
<MoveOnly
, true>> uim_rval
;
70 static_assert(!std::is_copy_constructible
<uim_rval
>::value
, "is not copyable");
72 typedef test_type
<Alloc
<MoveOnly
, false>> uim_lval
;
73 static_assert(std::is_copy_constructible
<uim_lval
>::value
, "is copyable");