// 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
