xref: /llvm-project/clang/test/Modules/lambda-definitions.cppm (revision bf9ab0b7c3ba1d4a89a3dd9b00909ad3cfab3d48)
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