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