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 Smithint main() 310c4a34b1SRichard Smith { 320c4a34b1SRichard Smith allocator_traits<A<char> >::rebind_traits<double> a; 330c4a34b1SRichard Smith } 34