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