[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / Modules / lambda-definitions.cppm
blobfb4bb8d298f0f04d80121addb8a8c4eeea7ea9e0
1 // RUN: rm -rf %t
2 // RUN: mkdir -p %t
3 // RUN: split-file %s %t
4 //
5 // RUN: %clang_cc1 -std=c++20 %t/invocable.cppm -emit-module-interface -o %t/invocable.pcm
6 // RUN: %clang_cc1 -std=c++20 %t/lambda.cppm -emit-module-interface -o %t/lambda.pcm  -fprebuilt-module-path=%t
7 // RUN: %clang_cc1 -std=c++20 %t/test.cc -fprebuilt-module-path=%t -fsyntax-only -verify
8 //
9 // RUN: %clang_cc1 -std=c++20 %t/invocable.cppm -emit-reduced-module-interface -o %t/invocable.pcm
10 // RUN: %clang_cc1 -std=c++20 %t/lambda.cppm -emit-reduced-module-interface -o %t/lambda.pcm  -fprebuilt-module-path=%t
11 // RUN: %clang_cc1 -std=c++20 %t/test.cc -fprebuilt-module-path=%t -fsyntax-only -verify
13 //--- invocable.cppm
14 export module invocable;
15 export template <class _Fn, class... _Args>
16 concept invocable = requires(_Fn&& __fn, _Args&&... __args) {
17   _Fn(__args...);
20 export template <class _Fn, class _Args>
21 constexpr bool is_callable(_Fn&& __fn, _Args&& __args) {
22     return invocable<_Fn, _Args>;
25 export template <class _Fn>
26 struct Callable : _Fn {
27     constexpr explicit Callable(_Fn &&__fn) : _Fn(static_cast<_Fn&&>(__fn)) {}
28     
29     template <class _Args>
30     constexpr auto operator()(_Args&& __args) {
31         return _Fn(__args);
32     }
35 //--- lambda.cppm
36 export module lambda;
37 import invocable;
38 export constexpr auto l = Callable([](auto &&x){});
40 //--- test.cc
41 // expected-no-diagnostics
42 import invocable;
43 import lambda;
45 static_assert(is_callable(l, 4) == true);