1 // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s
2
3 // expected-no-diagnostics
4
5 // Check recursive instantiation of lambda does not cause assertion.
6 // lambda function `f` in `fun1` is instantiated twice: first
7 // as f(f, Number<1>), then as f(f, Number<0>). The
8 // LocalInstantiationScopes of these two instantiations both contain
9 // `f` and `i`. However, since they are not merged, clang should not
10 // assert for that.
11
12 template <unsigned v>
13 struct Number
14 {
15 static constexpr unsigned value = v;
16 };
17
18 template <unsigned IBegin = 0,
19 unsigned IEnd = 1>
fun1(Number<IBegin>=Number<0>{},Number<IEnd>=Number<1>{})20 constexpr auto fun1(Number<IBegin> = Number<0>{}, Number<IEnd> = Number<1>{})
21 {
22 constexpr unsigned a = 0;
__anon58a6b9cc0102(auto fs, auto i) 23 auto f = [&](auto fs, auto i) {
24 if constexpr(i.value > 0)
25 {
26 (void)a;
27 return fs(fs, Number<IBegin>{});
28 }
29 (void)a;
30 };
31
32 return f(f, Number<IEnd>{});
33 }
34
35
fun2()36 void fun2() {
37 fun1();
38 }
39