Clang Project

clang_source_code/test/CodeGenCXX/castexpr-basepathsize-threshold.cpp
1// RUN: %clang_cc1 %s -emit-llvm-only -o -
2
3// https://bugs.llvm.org/show_bug.cgi?id=38356
4// We only check that we do not crash.
5
6// ASAN increases stack usage, so we are hitting stack overflow before reaching
7// recursive template instantiation limit.
8// XFAIL: darwin && asan
9
10template <typename a, a b(unsigned), int c, unsigned...>
11struct d : d<a, b, c - 1> {};
12template <typename a, a b(unsigned), unsigned... e>
13struct d<a, b, 0, e...> {
14  a f[0];
15};
16struct g {
17  static g h(unsigned);
18};
19struct i {
20  void j() const;
21  // Current maximum depth of recursive template instantiation is 1024,
22  // thus, this \/ threshold value is used here. BasePathSize in CastExpr might
23  // not fit it, so we are testing that we do fit it.
24  // If -ftemplate-depth= is provided, larger values (4096 and up) cause crashes
25  // elsewhere.
26  d<g, g::h, (1U << 10U) - 2U> f;
27};
28void i::j() const {
29  const void *k{f.f};
30  (void)k;
31}
32