1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -ast-print %s | FileCheck %s 2*67e74705SXin Li namespace N { 3*67e74705SXin Li template<typename T, typename U> void f(U); 4*67e74705SXin Li template<int> void f(); 5*67e74705SXin Li } 6*67e74705SXin Li g()7*67e74705SXin Livoid g() { 8*67e74705SXin Li // CHECK: N::f<int>(3.14 9*67e74705SXin Li N::f<int>(3.14); 10*67e74705SXin Li 11*67e74705SXin Li // CHECK: N::f<double> 12*67e74705SXin Li void (*fp)(int) = N::f<double>; 13*67e74705SXin Li } 14*67e74705SXin Li 15*67e74705SXin Li 16*67e74705SXin Li // (NNS qualified) DeclRefExpr. 17*67e74705SXin Li namespace DRE { 18*67e74705SXin Li 19*67e74705SXin Li template <typename T> 20*67e74705SXin Li void foo(); 21*67e74705SXin Li test()22*67e74705SXin Livoid test() { 23*67e74705SXin Li // CHECK: DRE::foo<int>; 24*67e74705SXin Li DRE::foo<int>; 25*67e74705SXin Li // CHECK: DRE::template foo<int>; 26*67e74705SXin Li DRE::template foo<int>; 27*67e74705SXin Li // CHECK: DRE::foo<int>(); 28*67e74705SXin Li DRE::foo<int>(); 29*67e74705SXin Li // CHECK: DRE::template foo<int>(); 30*67e74705SXin Li DRE::template foo<int>(); 31*67e74705SXin Li } 32*67e74705SXin Li 33*67e74705SXin Li } // namespace DRE 34*67e74705SXin Li 35*67e74705SXin Li 36*67e74705SXin Li // MemberExpr. 37*67e74705SXin Li namespace ME { 38*67e74705SXin Li 39*67e74705SXin Li struct S { 40*67e74705SXin Li template <typename T> 41*67e74705SXin Li void mem(); 42*67e74705SXin Li }; 43*67e74705SXin Li test()44*67e74705SXin Livoid test() { 45*67e74705SXin Li S s; 46*67e74705SXin Li // CHECK: s.mem<int>(); 47*67e74705SXin Li s.mem<int>(); 48*67e74705SXin Li // CHECK: s.template mem<int>(); 49*67e74705SXin Li s.template mem<int>(); 50*67e74705SXin Li } 51*67e74705SXin Li 52*67e74705SXin Li } // namespace ME 53*67e74705SXin Li 54*67e74705SXin Li 55*67e74705SXin Li // UnresolvedLookupExpr. 56*67e74705SXin Li namespace ULE { 57*67e74705SXin Li 58*67e74705SXin Li template <typename T> 59*67e74705SXin Li int foo(); 60*67e74705SXin Li 61*67e74705SXin Li template <typename T> test()62*67e74705SXin Livoid test() { 63*67e74705SXin Li // CHECK: ULE::foo<T>; 64*67e74705SXin Li ULE::foo<T>; 65*67e74705SXin Li // CHECK: ULE::template foo<T>; 66*67e74705SXin Li ULE::template foo<T>; 67*67e74705SXin Li } 68*67e74705SXin Li 69*67e74705SXin Li } // namespace ULE 70*67e74705SXin Li 71*67e74705SXin Li 72*67e74705SXin Li // UnresolvedMemberExpr. 73*67e74705SXin Li namespace UME { 74*67e74705SXin Li 75*67e74705SXin Li struct S { 76*67e74705SXin Li template <typename T> 77*67e74705SXin Li void mem(); 78*67e74705SXin Li }; 79*67e74705SXin Li 80*67e74705SXin Li template <typename U> test()81*67e74705SXin Livoid test() { 82*67e74705SXin Li S s; 83*67e74705SXin Li // CHECK: s.mem<U>(); 84*67e74705SXin Li s.mem<U>(); 85*67e74705SXin Li // CHECK: s.template mem<U>(); 86*67e74705SXin Li s.template mem<U>(); 87*67e74705SXin Li } 88*67e74705SXin Li 89*67e74705SXin Li } // namespace UME 90*67e74705SXin Li 91*67e74705SXin Li 92*67e74705SXin Li // DependentScopeDeclRefExpr. 93*67e74705SXin Li namespace DSDRE { 94*67e74705SXin Li 95*67e74705SXin Li template <typename T> 96*67e74705SXin Li struct S; 97*67e74705SXin Li 98*67e74705SXin Li template <typename T> test()99*67e74705SXin Livoid test() { 100*67e74705SXin Li // CHECK: S<T>::foo; 101*67e74705SXin Li S<T>::foo; 102*67e74705SXin Li // CHECK: S<T>::template foo; 103*67e74705SXin Li S<T>::template foo; 104*67e74705SXin Li // CHECK: S<T>::template foo<>; 105*67e74705SXin Li S<T>::template foo<>; 106*67e74705SXin Li // CHECK: S<T>::template foo<T>; 107*67e74705SXin Li S<T>::template foo<T>; 108*67e74705SXin Li } 109*67e74705SXin Li 110*67e74705SXin Li } // namespace DSDRE 111*67e74705SXin Li 112*67e74705SXin Li 113*67e74705SXin Li // DependentScopeMemberExpr. 114*67e74705SXin Li namespace DSME { 115*67e74705SXin Li 116*67e74705SXin Li template <typename T> 117*67e74705SXin Li struct S; 118*67e74705SXin Li 119*67e74705SXin Li template <typename T> test()120*67e74705SXin Livoid test() { 121*67e74705SXin Li S<T> s; 122*67e74705SXin Li // CHECK: s.foo; 123*67e74705SXin Li s.foo; 124*67e74705SXin Li // CHECK: s.template foo; 125*67e74705SXin Li s.template foo; 126*67e74705SXin Li // CHECK: s.template foo<>; 127*67e74705SXin Li s.template foo<>; 128*67e74705SXin Li // CHECK: s.template foo<T>; 129*67e74705SXin Li s.template foo<T>; 130*67e74705SXin Li } 131*67e74705SXin Li 132*67e74705SXin Li } // namespace DSME 133*67e74705SXin Li 134*67e74705SXin Li namespace DSDRE_withImplicitTemplateArgs { 135*67e74705SXin Li foo()136*67e74705SXin Litemplate <typename T> void foo() { 137*67e74705SXin Li // CHECK: T::template bar(); 138*67e74705SXin Li T::template bar(); 139*67e74705SXin Li } 140*67e74705SXin Li 141*67e74705SXin Li } // namespace DSDRE_withImplicitTemplateArgs 142