xref: /llvm-project/clang/test/SemaCXX/PR9902.cpp (revision c6e68daac0fa6e77a89f3ca72f266a528503dd1c)
19ca5c425SRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2*c6e68daaSAndy Gibbs // expected-no-diagnostics
35e96d832SRichard Smith 
45e96d832SRichard Smith template <class _Tp, class _Up, bool = false>
55e96d832SRichard Smith struct __allocator_traits_rebind
65e96d832SRichard Smith {
75e96d832SRichard Smith };
85e96d832SRichard Smith 
95e96d832SRichard Smith template <template <class, class...> class _Alloc, class _Tp, class ..._Args,
105e96d832SRichard Smith class _Up>
115e96d832SRichard Smith struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false>
125e96d832SRichard Smith {
135e96d832SRichard Smith    typedef _Alloc<_Up, _Args...> type;
145e96d832SRichard Smith };
155e96d832SRichard Smith 
165e96d832SRichard Smith template <class Alloc>
175e96d832SRichard Smith struct allocator_traits
185e96d832SRichard Smith {
195e96d832SRichard Smith    template <class T> using rebind_alloc = typename __allocator_traits_rebind<Alloc, T>::type;
205e96d832SRichard Smith    template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>;
215e96d832SRichard Smith };
225e96d832SRichard Smith 
235e96d832SRichard Smith template <class T>
245e96d832SRichard Smith struct allocator {};
255e96d832SRichard Smith 
main()265e96d832SRichard Smith int main()
275e96d832SRichard Smith {
285e96d832SRichard Smith    allocator_traits<allocator<char>>::rebind_alloc<int> a;
295e96d832SRichard Smith }
30