// RUN: %clang_cc1 -fsyntax-only -ast-print %s | FileCheck %s namespace N { template<typename T, typename U> void f(U); template<int> void f(); } void g() { // CHECK: N::f<int>(3.14 N::f<int>(3.14); // CHECK: N::f<double> void (*fp)(int) = N::f<double>; } // (NNS qualified) DeclRefExpr. namespace DRE { template <typename T> void foo(); void test() { // CHECK: DRE::foo<int>; DRE::foo<int>; // CHECK: DRE::template foo<int>; DRE::template foo<int>; // CHECK: DRE::foo<int>(); DRE::foo<int>(); // CHECK: DRE::template foo<int>(); DRE::template foo<int>(); } } // namespace DRE // MemberExpr. namespace ME { struct S { template <typename T> void mem(); }; void test() { S s; // CHECK: s.mem<int>(); s.mem<int>(); // CHECK: s.template mem<int>(); s.template mem<int>(); } } // namespace ME // UnresolvedLookupExpr. namespace ULE { template <typename T> int foo(); template <typename T> void test() { // CHECK: ULE::foo<T>; ULE::foo<T>; // CHECK: ULE::template foo<T>; ULE::template foo<T>; } } // namespace ULE // UnresolvedMemberExpr. namespace UME { struct S { template <typename T> void mem(); }; template <typename U> void test() { S s; // CHECK: s.mem<U>(); s.mem<U>(); // CHECK: s.template mem<U>(); s.template mem<U>(); } } // namespace UME // DependentScopeDeclRefExpr. namespace DSDRE { template <typename T> struct S; template <typename T> void test() { // CHECK: S<T>::foo; S<T>::foo; // CHECK: S<T>::template foo; S<T>::template foo; // CHECK: S<T>::template foo<>; S<T>::template foo<>; // CHECK: S<T>::template foo<T>; S<T>::template foo<T>; } } // namespace DSDRE // DependentScopeMemberExpr. namespace DSME { template <typename T> struct S; template <typename T> void test() { S<T> s; // CHECK: s.foo; s.foo; // CHECK: s.template foo; s.template foo; // CHECK: s.template foo<>; s.template foo<>; // CHECK: s.template foo<T>; s.template foo<T>; } } // namespace DSME namespace DSDRE_withImplicitTemplateArgs { template <typename T> void foo() { // CHECK: T::template bar(); T::template bar(); } } // namespace DSDRE_withImplicitTemplateArgs