1e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith// RUN: %clang_cc1 -std=c++1y -verify %s
2e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith// expected-no-diagnostics
3e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith
4e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smithtemplate<typename T> struct A {
5e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith  template<typename U> struct B;
6e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith  template<typename U> struct B<U*>;
7e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith};
8e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smithtemplate<typename T> template<typename U> struct A<T>::B<U*> {};
9e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smithtemplate struct A<int>;
10e688ddf351d5d77d18cd01727e672e4b69706b23Richard SmithA<int>::B<int*> b;
11e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith
12e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith
13e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smithtemplate<typename T> struct B {
14e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith  template<typename U> static const int var1;
15e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith  template<typename U> static const int var1<U*>;
16e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith
17e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith  template<typename U> static const int var2;
18e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smith};
19e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smithtemplate<typename T> template<typename U> const int B<T>::var1<U*> = 1;
20e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smithtemplate<typename T> template<typename U> const int B<T>::var2<U*> = 1;
21e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smithtemplate struct B<int>;
22e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smithint b_test1[B<int>::var1<int*>];
23e688ddf351d5d77d18cd01727e672e4b69706b23Richard Smithint b_test2[B<int>::var2<int*>];
24