reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    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