1*bf9ab0b7SChuanqi Xu// RUN: rm -rf %t 2*bf9ab0b7SChuanqi Xu// RUN: mkdir -p %t 3*bf9ab0b7SChuanqi Xu// RUN: split-file %s %t 4*bf9ab0b7SChuanqi Xu// 5*bf9ab0b7SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/invocable.cppm -emit-module-interface -o %t/invocable.pcm 6*bf9ab0b7SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/lambda.cppm -emit-module-interface -o %t/lambda.pcm -fprebuilt-module-path=%t 7*bf9ab0b7SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/test.cc -fprebuilt-module-path=%t -fsyntax-only -verify 8*bf9ab0b7SChuanqi Xu// 9*bf9ab0b7SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/invocable.cppm -emit-reduced-module-interface -o %t/invocable.pcm 10*bf9ab0b7SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/lambda.cppm -emit-reduced-module-interface -o %t/lambda.pcm -fprebuilt-module-path=%t 11*bf9ab0b7SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/test.cc -fprebuilt-module-path=%t -fsyntax-only -verify 12*bf9ab0b7SChuanqi Xu 13*bf9ab0b7SChuanqi Xu//--- invocable.cppm 14*bf9ab0b7SChuanqi Xuexport module invocable; 15*bf9ab0b7SChuanqi Xuexport template <class _Fn, class... _Args> 16*bf9ab0b7SChuanqi Xuconcept invocable = requires(_Fn&& __fn, _Args&&... __args) { 17*bf9ab0b7SChuanqi Xu _Fn(__args...); 18*bf9ab0b7SChuanqi Xu}; 19*bf9ab0b7SChuanqi Xu 20*bf9ab0b7SChuanqi Xuexport template <class _Fn, class _Args> 21*bf9ab0b7SChuanqi Xuconstexpr bool is_callable(_Fn&& __fn, _Args&& __args) { 22*bf9ab0b7SChuanqi Xu return invocable<_Fn, _Args>; 23*bf9ab0b7SChuanqi Xu} 24*bf9ab0b7SChuanqi Xu 25*bf9ab0b7SChuanqi Xuexport template <class _Fn> 26*bf9ab0b7SChuanqi Xustruct Callable : _Fn { 27*bf9ab0b7SChuanqi Xu constexpr explicit Callable(_Fn &&__fn) : _Fn(static_cast<_Fn&&>(__fn)) {} 28*bf9ab0b7SChuanqi Xu 29*bf9ab0b7SChuanqi Xu template <class _Args> 30*bf9ab0b7SChuanqi Xu constexpr auto operator()(_Args&& __args) { 31*bf9ab0b7SChuanqi Xu return _Fn(__args); 32*bf9ab0b7SChuanqi Xu } 33*bf9ab0b7SChuanqi Xu}; 34*bf9ab0b7SChuanqi Xu 35*bf9ab0b7SChuanqi Xu//--- lambda.cppm 36*bf9ab0b7SChuanqi Xuexport module lambda; 37*bf9ab0b7SChuanqi Xuimport invocable; 38*bf9ab0b7SChuanqi Xuexport constexpr auto l = Callable([](auto &&x){}); 39*bf9ab0b7SChuanqi Xu 40*bf9ab0b7SChuanqi Xu//--- test.cc 41*bf9ab0b7SChuanqi Xu// expected-no-diagnostics 42*bf9ab0b7SChuanqi Xuimport invocable; 43*bf9ab0b7SChuanqi Xuimport lambda; 44*bf9ab0b7SChuanqi Xu 45*bf9ab0b7SChuanqi Xustatic_assert(is_callable(l, 4) == true); 46