1f6702a3927147655206ae729a84339c4fda4c651Richard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -fsyntax-only -std=c++1y -verify %s -DCXX1Y
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef CXX1Y
5f6702a3927147655206ae729a84339c4fda4c651Richard Smith
6f6702a3927147655206ae729a84339c4fda4c651Richard Smithtemplate<typename T, typename U, U> using alias_ref = T;
7f6702a3927147655206ae729a84339c4fda4c651Richard Smithtemplate<typename T, typename U, U> void func_ref() {}
8f6702a3927147655206ae729a84339c4fda4c651Richard Smithtemplate<typename T, typename U, U> struct class_ref {};
9f6702a3927147655206ae729a84339c4fda4c651Richard Smith
10f6702a3927147655206ae729a84339c4fda4c651Richard Smithtemplate<int N>
11f6702a3927147655206ae729a84339c4fda4c651Richard Smithstruct U {
12f6702a3927147655206ae729a84339c4fda4c651Richard Smith  static int a;
13f6702a3927147655206ae729a84339c4fda4c651Richard Smith};
14f6702a3927147655206ae729a84339c4fda4c651Richard Smith
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate<int N> struct S; // expected-note 6{{here}}
16f6702a3927147655206ae729a84339c4fda4c651Richard Smith
17f6702a3927147655206ae729a84339c4fda4c651Richard Smithtemplate<int N>
18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint U<N>::a = S<N>::kError; // expected-error 6{{undefined}}
19f6702a3927147655206ae729a84339c4fda4c651Richard Smith
20f6702a3927147655206ae729a84339c4fda4c651Richard Smithtemplate<typename T>
21f6702a3927147655206ae729a84339c4fda4c651Richard Smithvoid f() {
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  (void)alias_ref<int, int&, U<0>::a>(); // expected-note {{here}}
23f6702a3927147655206ae729a84339c4fda4c651Richard Smith  (void)func_ref<int, int&, U<1>::a>(); // expected-note {{here}}
24f6702a3927147655206ae729a84339c4fda4c651Richard Smith  (void)class_ref<int, int&, U<2>::a>(); // expected-note {{here}}
25f6702a3927147655206ae729a84339c4fda4c651Richard Smith};
26f6702a3927147655206ae729a84339c4fda4c651Richard Smith
27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate<int N>
29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid fi() {
30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  (void)alias_ref<int, int&, U<N>::a>(); // expected-note {{here}}
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  (void)func_ref<int, int&, U<N+1>::a>(); // expected-note {{here}}
32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  (void)class_ref<int, int&, U<N+2>::a>(); // expected-note {{here}}
33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
35f6702a3927147655206ae729a84339c4fda4c651Richard Smithint main() {
36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  f<int>();   // NOTE: Non-dependent name uses are type-checked at template definition time.
37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  fi<10>();   // expected-note 3{{here}}
38f6702a3927147655206ae729a84339c4fda4c651Richard Smith}
39f6702a3927147655206ae729a84339c4fda4c651Richard Smith
40f6702a3927147655206ae729a84339c4fda4c651Richard Smithnamespace N {
41f6702a3927147655206ae729a84339c4fda4c651Richard Smith  template<typename T> struct S { static int n; };
42f6702a3927147655206ae729a84339c4fda4c651Richard Smith  template<typename T> int S<T>::n = 5;
43f6702a3927147655206ae729a84339c4fda4c651Richard Smith  void g(int*);
44f6702a3927147655206ae729a84339c4fda4c651Richard Smith  template<typename T> int f() {
45f6702a3927147655206ae729a84339c4fda4c651Richard Smith    int k[S<T>::n];
46f6702a3927147655206ae729a84339c4fda4c651Richard Smith    g(k);
47f6702a3927147655206ae729a84339c4fda4c651Richard Smith    return k[3];
48f6702a3927147655206ae729a84339c4fda4c651Richard Smith  }
49f6702a3927147655206ae729a84339c4fda4c651Richard Smith  int j = f<int>();
50f6702a3927147655206ae729a84339c4fda4c651Richard Smith}
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#else
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-no-diagnostics
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace { template<typename> extern int n; }
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate<typename T> int g() { return n<int>; }
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace { extern template int n<int>; }
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
61