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