160 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 %s -emit-llvm -o - -ftime-report  2>&1 | FileCheck %s
 | |
| // RUN: %clang_cc1 %s -emit-llvm -o - -fdelayed-template-parsing -DDELAYED_TEMPLATE_PARSING -ftime-report  2>&1 | FileCheck %s
 | |
| 
 | |
| // Template function declarations
 | |
| template <typename T>
 | |
| void foo();
 | |
| template <typename T, typename U>
 | |
| void foo();
 | |
| 
 | |
| // Template function definitions.
 | |
| template <typename T>
 | |
| void foo() {}
 | |
| 
 | |
| // Template class (forward) declarations
 | |
| template <typename T>
 | |
| struct A;
 | |
| template <typename T, typename U>
 | |
| struct b;
 | |
| template <typename>
 | |
| struct C;
 | |
| template <typename, typename>
 | |
| struct D;
 | |
| 
 | |
| // Forward declarations with default parameters?
 | |
| template <typename T = int>
 | |
| class X1;
 | |
| template <typename = int>
 | |
| class X2;
 | |
| 
 | |
| // Forward declarations w/template template parameters
 | |
| template <template <typename> class T>
 | |
| class TTP1;
 | |
| template <template <typename> class>
 | |
| class TTP2;
 | |
| template <template <typename X, typename Y> class T>
 | |
| class TTP5;
 | |
| 
 | |
| // Forward declarations with non-type params
 | |
| template <int>
 | |
| class NTP0;
 | |
| template <int N>
 | |
| class NTP1;
 | |
| template <int N = 5>
 | |
| class NTP2;
 | |
| template <int = 10>
 | |
| class NTP3;
 | |
| template <unsigned int N = 12u>
 | |
| class NTP4;
 | |
| template <unsigned int = 12u>
 | |
| class NTP5;
 | |
| template <unsigned = 15u>
 | |
| class NTP6;
 | |
| template <typename T, T Obj>
 | |
| class NTP7;
 | |
| 
 | |
| // Template class declarations
 | |
| template <typename T>
 | |
| struct A {};
 | |
| template <typename T, typename U>
 | |
| struct B {};
 | |
| 
 | |
| namespace PR6184 {
 | |
| namespace N {
 | |
| template <typename T>
 | |
| void bar(typename T::x);
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| void N::bar(typename T::x) {}
 | |
| }
 | |
| 
 | |
| // This PR occurred only in template parsing mode.
 | |
| namespace PR17637 {
 | |
| template <int>
 | |
| struct L {
 | |
|   template <typename T>
 | |
|   struct O {
 | |
|     template <typename U>
 | |
|     static void Fun(U);
 | |
|   };
 | |
| };
 | |
| 
 | |
| template <int k>
 | |
| template <typename T>
 | |
| template <typename U>
 | |
| void L<k>::O<T>::Fun(U) {}
 | |
| 
 | |
| void Instantiate() { L<0>::O<int>::Fun(0); }
 | |
| }
 | |
| 
 | |
| namespace explicit_partial_specializations {
 | |
| typedef char (&oneT)[1];
 | |
| typedef char (&twoT)[2];
 | |
| typedef char (&threeT)[3];
 | |
| typedef char (&fourT)[4];
 | |
| typedef char (&fiveT)[5];
 | |
| typedef char (&sixT)[6];
 | |
| 
 | |
| char one[1];
 | |
| char two[2];
 | |
| char three[3];
 | |
| char four[4];
 | |
| char five[5];
 | |
| char six[6];
 | |
| 
 | |
| template <bool b>
 | |
| struct bool_ { typedef int type; };
 | |
| template <>
 | |
| struct bool_<false> {};
 | |
| 
 | |
| #define XCAT(x, y) x##y
 | |
| #define CAT(x, y) XCAT(x, y)
 | |
| #define sassert(_b_) bool_<(_b_)>::type CAT(var, __LINE__);
 | |
| 
 | |
| template <int>
 | |
| struct L {
 | |
|   template <typename T>
 | |
|   struct O {
 | |
|     template <typename U>
 | |
|     static oneT Fun(U);
 | |
|   };
 | |
| };
 | |
| template <int k>
 | |
| template <typename T>
 | |
| template <typename U>
 | |
| oneT L<k>::O<T>::Fun(U) { return one; }
 | |
| 
 | |
| template <>
 | |
| template <>
 | |
| template <typename U>
 | |
| oneT L<0>::O<char>::Fun(U) { return one; }
 | |
| 
 | |
| void Instantiate() {
 | |
|   sassert(sizeof(L<0>::O<int>::Fun(0)) == sizeof(one));
 | |
|   sassert(sizeof(L<0>::O<char>::Fun(0)) == sizeof(one));
 | |
| }
 | |
| }
 | |
| 
 | |
| template <class>
 | |
| struct Foo {
 | |
|   template <class _Other>
 | |
|   using rebind_alloc = _Other;
 | |
| };
 | |
| template <class _Alloc>
 | |
| struct _Wrap_alloc {
 | |
|   template <class _Other>
 | |
|   using rebind_alloc = typename Foo<_Alloc>::template rebind_alloc<_Other>;
 | |
|   template <class>
 | |
|   using rebind = _Wrap_alloc;
 | |
| };
 | |
| _Wrap_alloc<int>::rebind<int> w;
 | |
| 
 | |
| // CHECK: Miscellaneous Ungrouped Timers
 | |
| // CHECK-DAG: LLVM IR Generation Time
 | |
| // CHECK-DAG: Code Generation Time
 | |
| // CHECK: Total
 | |
| // CHECK: Clang front-end time report
 | |
| // CHECK: Clang front-end timer
 | |
| // CHECK: Total
 |