mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-03 21:56:05 +00:00

Some buildbots seems to have problems with the CHECKs in test/Frontend/ftime-report-template-decl.cpp. I this the problem is that the order in which timers are printed is based on consumed wall time. So there is no guarantee in which order the timers are printed. This patch uses CHECK-DAG instead of CHECK to make the test case less sensitive to the actual time used by the different passes. The (sometimes) failing test cases where introduced in trunk@330571. llvm-svn: 330622
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
|