1*4a1ccfe8SRichard Smith // RUN: %clang_cc1 -fmodules -std=c++17 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s 2*4a1ccfe8SRichard Smith 3*4a1ccfe8SRichard Smith #pragma clang module build A 4*4a1ccfe8SRichard Smith module A {} 5*4a1ccfe8SRichard Smith #pragma clang module contents 6*4a1ccfe8SRichard Smith #pragma clang module begin A 7*4a1ccfe8SRichard Smith template<typename T> T f(T v) { 8*4a1ccfe8SRichard Smith v(); 9*4a1ccfe8SRichard Smith return v; 10*4a1ccfe8SRichard Smith } 11*4a1ccfe8SRichard Smith inline auto g() { 12*4a1ccfe8SRichard Smith int n = 0; __anone4e5d8fc0102null13*4a1ccfe8SRichard Smith return f([=] { return n; }); 14*4a1ccfe8SRichard Smith } 15*4a1ccfe8SRichard Smith 16*4a1ccfe8SRichard Smith template<typename T> constexpr T f2(T v) { 17*4a1ccfe8SRichard Smith v(); 18*4a1ccfe8SRichard Smith return v; 19*4a1ccfe8SRichard Smith } 20*4a1ccfe8SRichard Smith constexpr auto g2() { 21*4a1ccfe8SRichard Smith int n = 0; __anone4e5d8fc0202null22*4a1ccfe8SRichard Smith return f2([=] { return n; }); 23*4a1ccfe8SRichard Smith } 24*4a1ccfe8SRichard Smith #pragma clang module end 25*4a1ccfe8SRichard Smith #pragma clang module endbuild 26*4a1ccfe8SRichard Smith 27*4a1ccfe8SRichard Smith #pragma clang module build B 28*4a1ccfe8SRichard Smith module B {} 29*4a1ccfe8SRichard Smith #pragma clang module contents 30*4a1ccfe8SRichard Smith #pragma clang module begin B 31*4a1ccfe8SRichard Smith template<typename T> T f(T v) { 32*4a1ccfe8SRichard Smith v(); 33*4a1ccfe8SRichard Smith return v; 34*4a1ccfe8SRichard Smith } 35*4a1ccfe8SRichard Smith inline auto g() { 36*4a1ccfe8SRichard Smith int n = 0; __anone4e5d8fc0302null37*4a1ccfe8SRichard Smith return f([=] { return n; }); 38*4a1ccfe8SRichard Smith } 39*4a1ccfe8SRichard Smith 40*4a1ccfe8SRichard Smith template<typename T> constexpr T f2(T v) { 41*4a1ccfe8SRichard Smith v(); 42*4a1ccfe8SRichard Smith return v; 43*4a1ccfe8SRichard Smith } 44*4a1ccfe8SRichard Smith constexpr auto g2() { 45*4a1ccfe8SRichard Smith int n = 0; __anone4e5d8fc0402null46*4a1ccfe8SRichard Smith return f2([=] { return n; }); 47*4a1ccfe8SRichard Smith } 48*4a1ccfe8SRichard Smith #pragma clang module end 49*4a1ccfe8SRichard Smith #pragma clang module endbuild 50*4a1ccfe8SRichard Smith 51*4a1ccfe8SRichard Smith #pragma clang module import A 52*4a1ccfe8SRichard Smith #pragma clang module import B 53*4a1ccfe8SRichard Smith 54*4a1ccfe8SRichard Smith // CHECK: define {{.*}}use_g 55*4a1ccfe8SRichard Smith int use_g() { 56*4a1ccfe8SRichard Smith return g()(); 57*4a1ccfe8SRichard Smith } 58*4a1ccfe8SRichard Smith 59*4a1ccfe8SRichard Smith static_assert(g2()() == 0); 60