File tree Expand file tree Collapse file tree 2 files changed +57
-0
lines changed Expand file tree Collapse file tree 2 files changed +57
-0
lines changed Original file line number Diff line number Diff line change @@ -1785,6 +1785,18 @@ void ASTDeclWriter::VisitClassTemplateSpecializationDecl(
1785
1785
if (ArgsWritten)
1786
1786
Record.AddASTTemplateArgumentListInfo (ArgsWritten);
1787
1787
1788
+ // Mention the implicitly generated C++ deduction guide to make sure the
1789
+ // deduction guide will be rewritten as expected.
1790
+ //
1791
+ // FIXME: Would it be more efficient to add a callback register function
1792
+ // in sema to register the deduction guide?
1793
+ if (Writer.isWritingStdCXXNamedModules ()) {
1794
+ auto Name = Context.DeclarationNames .getCXXDeductionGuideName (
1795
+ D->getSpecializedTemplate ());
1796
+ for (auto *DG : D->getDeclContext ()->noload_lookup (Name))
1797
+ Writer.GetDeclRef (DG->getCanonicalDecl ());
1798
+ }
1799
+
1788
1800
Code = serialization::DECL_CLASS_TEMPLATE_SPECIALIZATION;
1789
1801
}
1790
1802
Original file line number Diff line number Diff line change
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
12
+
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...);
18
+ };
19
+
20
+ export template <class _Fn , class _Args >
21
+ constexpr bool is_callable (_Fn&& __fn, _Args&& __args) {
22
+ return invocable<_Fn, _Args>;
23
+ }
24
+
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
+ }
33
+ };
34
+
35
+ // --- lambda.cppm
36
+ export module lambda;
37
+ import invocable;
38
+ export constexpr auto l = Callable([](auto &&x){});
39
+
40
+ // --- test.cc
41
+ // expected-no-diagnostics
42
+ import invocable;
43
+ import lambda;
44
+
45
+ static_assert (is_callable(l, 4 ) == true);
You can’t perform that action at this time.
0 commit comments