1 // { dg-do compile }
2 
3 // Origin: Debian GCC maintainers <debian-gcc@lists.debian.org>
4 //	   Wolfgang Bangerth <bangerth@dealii.org>
5 
6 // PR c++/16706: Dependent type calculation during access checking
7 
8 template <typename> struct B {
throwB9     B() throw() {}
10     struct S { };
11     static int i;
12     typedef unsigned short int dummy;
13 };
14 
15 template <typename _Tp>
16 struct allocator: B<_Tp> {
17     template<typename _Tp1> struct rebind
18     { typedef allocator<_Tp1> other; };
19 };
20 
21 template<typename T, typename>
22 struct X {
23     typename allocator<T>::template rebind<int>::other i;
24     typedef int* dummy;
25 };
26 
27 template <class T> class A {
28     typedef typename X<T,allocator<T> >::dummy dummy;
29     template <class TP> class XWrapper;
30 };
31 
32 
33 template <class T>
34 template <class TP> struct A<T>::XWrapper<TP *>
35 {
36     XWrapper() {}
37     X<int,allocator<int> > x;
38 };
39 
40 template class A<int>::XWrapper<int *>;
41