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
 | 
