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