1 /* { dg-do compile } */
2 /* { dg-options "-g -dA -std=gnu++11" } */
3 namespace std
4 {
5 template <typename _Tp> struct integral_constant
6 {
7   static constexpr _Tp value = 0;
8 };
9 template <int> using __bool_constant = integral_constant<int>;
10 struct __not_ : integral_constant<int>
11 {
12 };
13 template <typename, typename, template <typename...> class _Op,
14           typename... _Args>
15 struct __detector
16 {
17   using type = _Op<_Args...>;
18 };
19 template <typename _Default, template <typename...> class _Op,
20           typename... _Args>
21 using __detected_or = __detector<_Default, void, _Op, _Args...>;
22 template <typename _Default, template <typename...> class _Op,
23           typename... _Args>
24 using __detected_or_t = typename __detected_or<_Default, _Op, _Args...>::type;
25 template <template <typename...> class _Default,
26           template <typename...> class _Op, typename... _Args>
27 using __detected_or_t_ = __detected_or_t<_Default<_Args...>, _Op, _Args...>;
28 template <typename, typename> struct pair;
29 template <typename, typename> using __replace_first_arg_t = int;
30 }
31 class new_allocator
32 {
33 };
34 namespace std
35 {
36 template <typename> using __allocator_base = new_allocator;
37 template <typename> class allocator : __allocator_base<int>
38 {
39 };
40 template <typename> struct equal_to;
41 struct __allocator_traits_base
42 {
43   template <typename _Alloc, typename _Up>
44   using __rebind = typename _Alloc::template rebind<_Up>::other;
45 };
46 template <typename _Alloc, typename _Up>
47 using __alloc_rebind
48     = __detected_or_t_<__replace_first_arg_t,
49                        __allocator_traits_base::__rebind, _Alloc, _Up>;
50 }
51 struct __alloc_traits
52 {
53   static int _S_select_on_copy;
54 };
55 namespace std
56 {
57 template <typename> struct hash;
58 namespace __detail
59 {
60 struct _Select1st;
61 struct _Hashtable_traits
62 {
63   using __hash_cached = __bool_constant<0>;
64 };
65 template <typename, int> struct _Hash_node;
66 template <typename _Value> struct _Hash_node<_Value, 0>
67 {
68   int &_M_v ();
69 };
70 struct _Mod_range_hashing;
71 struct _Default_ranged_hash;
72 struct _Prime_rehash_policy
73 {
74   using __has_load_factor = integral_constant<int>;
75 };
76 struct _Map_base
77 {
78 };
79 struct _Insert
80 {
81 };
82 template <typename _Policy>
83 using __has_load_factor = typename _Policy::__has_load_factor;
84 template <typename _RehashPolicy, typename,
85           typename = __detected_or_t<integral_constant<bool>,
86                                      __has_load_factor, _RehashPolicy> >
87 struct _Rehash_base;
88 template <typename _RehashPolicy, typename _Traits>
89 struct _Rehash_base<_RehashPolicy, _Traits, integral_constant<int> > {};
90 struct _Hashtable_ebo_helper { template <typename _OtherTp> _Hashtable_ebo_helper (_OtherTp); };
91 struct _Hashtable_base {};
92 struct _Equality {};
93 template <typename _NodeAlloc> struct _Hashtable_alloc : _Hashtable_ebo_helper
94 {
95   using __ebo_node_alloc = _Hashtable_ebo_helper;
96   using __node_type = typename _NodeAlloc::value_type;
97   using __node_alloc_traits = __alloc_traits;
98   template <typename _Alloc> _Hashtable_alloc (_Alloc) : __ebo_node_alloc (0) {}
99   template <typename... _Args> __node_type *_M_allocate_node (...);
100 };
101 }
102 template <typename, typename> using __cache_default = __not_;
103 template <typename _Key, typename _Value, typename _Alloc, typename _ExtractKey, typename _Equal, typename _H1, typename _H2,
104           typename _Hash, typename _RehashPolicy, typename _Traits>
105 struct _Hashtable : __detail::_Hashtable_base, __detail::_Map_base, __detail::_Insert, __detail::_Rehash_base<_RehashPolicy, int>,
106   __detail::_Equality, __detail:: _Hashtable_alloc<__alloc_rebind<_Alloc, __detail::_Hash_node<_Value, _Traits::__hash_cached::value> > >
107 {
108   using __traits_type = _Traits;
109   using __hash_cached = typename __traits_type::__hash_cached;
110   using __node_type = __detail::_Hash_node<_Value, __hash_cached::value>;
111   using __node_alloc_type = __alloc_rebind<_Alloc, __node_type>;
112   using __hashtable_alloc = __detail::_Hashtable_alloc<__node_alloc_type>;
113   using typename __hashtable_alloc::__node_alloc_traits;
114   _Key key_type;
115   _RehashPolicy _M_rehash_policy;
116   template <typename _NodeGenerator>
117   void _M_assign (const _Hashtable &, const _NodeGenerator &);
118   _Hashtable ();
119   _Hashtable (const _Hashtable &);
120 };
121 template <typename _Key, typename _Value, typename _Alloc, typename _ExtractKey, typename _Equal, typename _H1, typename _H2,
122           typename _Hash, typename _RehashPolicy, typename _Traits>
123 template <typename _NodeGenerator>
124 void _Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy,
125                 _Traits>::_M_assign (const _Hashtable &__ht, const _NodeGenerator &__node_gen) try {
126 __node_type *__this_n = __node_gen (0); } catch (...) {}
127 template <typename _Key, typename _Value, typename _Alloc, typename _ExtractKey, typename _Equal, typename _H1, typename _H2,
128           typename _Hash, typename _RehashPolicy, typename _Traits>
129 _Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>::_Hashtable (const _Hashtable &__ht)
130     : __hashtable_alloc (__node_alloc_traits::_S_select_on_copy), _M_rehash_policy ()
131 {
132   _M_assign (__ht, [this](__node_type *__n) { return this->_M_allocate_node (__n->_M_v ()); });
133 }
134 template <bool _Cache> using __umap_traits = __detail::_Hashtable_traits;
135 template <typename _Key, typename _Tp, typename _Hash = hash<_Key>, typename _Pred = std::equal_to<_Key>,
136           typename _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
137           typename _Tr = __umap_traits<__cache_default<_Key, _Hash>::value> >
138 using __umap_hashtable = _Hashtable<_Key, std::pair<const _Key, _Tp>, _Alloc, __detail::_Select1st, _Pred, _Hash,
139                                     __detail::_Mod_range_hashing, __detail::_Default_ranged_hash, __detail::_Prime_rehash_policy, _Tr>;
140 template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = std::equal_to<_Key>,
141           class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
142 struct unordered_map
143 {
144   typedef __umap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc> _Hashtable;
145   _Hashtable _M_h;
146   unordered_map (const int &__a) : _M_h () {}
147 };
148 }
149 struct uneq_allocator_base {};
150 template <typename Tp> struct uneq_allocator : uneq_allocator_base { typedef Tp value_type; };
151 template <typename Tp, typename Alloc = std::allocator<Tp> >
152 struct Trans_NS___gnu_test_propagating_allocator : public uneq_allocator<Tp>
153 {
154   template <typename Up> struct rebind { typedef Trans_NS___gnu_test_propagating_allocator<Up, int> other; };
155 };
156 void fn1 ()
157 {
158   std::unordered_map<int, int, int, int, Trans_NS___gnu_test_propagating_allocator<int> > v1 (0);
159   std::unordered_map<int, int, int, int, Trans_NS___gnu_test_propagating_allocator<int> > v2 (v1);
160 }
161