forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			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
 |