1 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
2 | // expected-no-diagnostics |
3 | |
4 | template <class _Tp, class _Up> |
5 | struct __allocator_traits_rebind |
6 | { |
7 | typedef typename _Tp::template rebind<_Up>::other type; |
8 | }; |
9 | |
10 | template <class Alloc> |
11 | struct allocator_traits |
12 | { |
13 | typedef Alloc allocator_type; |
14 | template <class T> using rebind_alloc = typename |
15 | __allocator_traits_rebind<allocator_type, T>::type; |
16 | template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>; |
17 | }; |
18 | |
19 | template <class T> |
20 | struct ReboundA {}; |
21 | |
22 | template <class T> |
23 | struct A |
24 | { |
25 | typedef T value_type; |
26 | |
27 | template <class U> struct rebind {typedef ReboundA<U> other;}; |
28 | }; |
29 | |
30 | int main() |
31 | { |
32 | allocator_traits<A<char> >::rebind_traits<double> a; |
33 | } |
34 | |