xref: /llvm-project/clang/test/SemaCXX/PR9908.cpp (revision c6e68daac0fa6e77a89f3ca72f266a528503dd1c)
19ca5c425SRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2*c6e68daaSAndy Gibbs // expected-no-diagnostics
30c4a34b1SRichard Smith 
40c4a34b1SRichard Smith template <class _Tp, class _Up>
50c4a34b1SRichard Smith struct __allocator_traits_rebind
60c4a34b1SRichard Smith {
70c4a34b1SRichard Smith     typedef typename _Tp::template rebind<_Up>::other type;
80c4a34b1SRichard Smith };
90c4a34b1SRichard Smith 
100c4a34b1SRichard Smith template <class Alloc>
110c4a34b1SRichard Smith struct allocator_traits
120c4a34b1SRichard Smith {
130c4a34b1SRichard Smith     typedef Alloc allocator_type;
140c4a34b1SRichard Smith     template <class T> using rebind_alloc = typename
150c4a34b1SRichard Smith __allocator_traits_rebind<allocator_type, T>::type;
160c4a34b1SRichard Smith     template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>;
170c4a34b1SRichard Smith };
180c4a34b1SRichard Smith 
190c4a34b1SRichard Smith template <class T>
200c4a34b1SRichard Smith struct ReboundA {};
210c4a34b1SRichard Smith 
220c4a34b1SRichard Smith template <class T>
230c4a34b1SRichard Smith struct A
240c4a34b1SRichard Smith {
250c4a34b1SRichard Smith     typedef T value_type;
260c4a34b1SRichard Smith 
270c4a34b1SRichard Smith     template <class U> struct rebind {typedef ReboundA<U> other;};
280c4a34b1SRichard Smith };
290c4a34b1SRichard Smith 
main()300c4a34b1SRichard Smith int main()
310c4a34b1SRichard Smith {
320c4a34b1SRichard Smith     allocator_traits<A<char> >::rebind_traits<double> a;
330c4a34b1SRichard Smith }
34