1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
// 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
|