// 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 |