142 lines
2.1 KiB
C++
142 lines
2.1 KiB
C++
// 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
|