| // RUN: rm -rf %t | |
| // RUN: mkdir %t | |
| // RUN: split-file %s %t | |
| // RUN: mkdir %t/tmp | |
| // RUN: %clang_cc1 -std=c++26 %t/std.cppm -emit-module-interface -o %t/std.pcm | |
| // RUN: %clang_cc1 -std=c++26 %t/optional.cppm -emit-module-interface -o %t/optional.pcm \ | |
| // RUN: -fmodule-file=std=%t/std.pcm | |
| // RUN: %clang_cc1 -std=c++26 %t/date.format.cppm -emit-module-interface -o %t/date.format.pcm \ | |
| // RUN: -fmodule-file=std=%t/std.pcm \ | |
| // RUN: -fmodule-file=bopt.optional=%t/optional.pcm | |
| // RUN: %clang_cc1 -std=c++26 %t/annotated.cppm -emit-module-interface -o %t/annotated.pcm \ | |
| // RUN: -fmodule-file=std=%t/std.pcm \ | |
| // RUN: -fmodule-file=bopt.optional=%t/optional.pcm \ | |
| // RUN: -fmodule-file=ldgr:date.format=%t/date.format.pcm | |
| // RUN: %clang_cc1 -std=c++26 %t/annotated.format.cppm -emit-module-interface -o %t/annotated.format.pcm \ | |
| // RUN: -fmodule-file=std=%t/std.pcm \ | |
| // RUN: -fmodule-file=bopt.optional=%t/optional.pcm \ | |
| // RUN: -fmodule-file=ldgr:date.format=%t/date.format.pcm \ | |
| // RUN: -fmodule-file=ldgr:annotated=%t/annotated.pcm | |
| // RUN: %clang_cc1 -std=c++26 %t/date.test.cppm -emit-module-interface -o %t/date.test.pcm \ | |
| // RUN: -fmodule-file=std=%t/std.pcm \ | |
| // RUN: -fmodule-file=bopt.optional=%t/optional.pcm \ | |
| // RUN: -fmodule-file=ldgr:date.format=%t/date.format.pcm \ | |
| // RUN: -fmodule-file=ldgr:annotated=%t/annotated.pcm \ | |
| // RUN: -fmodule-file=ldgr:annotated.format=%t/annotated.format.pcm | |
| // RUN: %clang_cc1 -std=c++26 -w %t/annotated.test.cpp -fsyntax-only -verify \ | |
| // RUN: -fmodule-file=std=%t/std.pcm \ | |
| // RUN: -fmodule-file=bopt.optional=%t/optional.pcm \ | |
| // RUN: -fmodule-file=ldgr:date.format=%t/date.format.pcm \ | |
| // RUN: -fmodule-file=ldgr:annotated=%t/annotated.pcm \ | |
| // RUN: -fmodule-file=ldgr:annotated.format=%t/annotated.format.pcm \ | |
| // RUN: -fmodule-file=ldgr:date.testlib=%t/date.test.pcm | |
| //--- std.cppm | |
| module; | |
| namespace std { | |
| inline namespace __1 { | |
| template <class _Tp> _Tp forward(_Tp); | |
| template <class... _Args> | |
| void __invoke(_Args... __args) noexcept( | |
| noexcept(__builtin_invoke(forward(__args)...))); | |
| using string = char; | |
| struct in_place_t { | |
| } in_place; | |
| template <typename...> struct __traits; | |
| struct Trans_NS___visitation___base { | |
| template <class _Visitor, class... _Vs> | |
| static void __visit_alt(_Visitor, _Vs... __vs) { | |
| __make_fmatrix<_Visitor, decltype(__vs)...>; | |
| } | |
| struct __dispatcher { | |
| template <class _Fp, class... _Vs> static void __dispatch(_Vs... __vs) { | |
| _Fp __f; | |
| __invoke(__f, __vs...); | |
| } | |
| }; | |
| template <class _Fp, class... _Vs> static void __make_dispatch() { | |
| __dispatcher::__dispatch<_Fp, _Vs...>; | |
| } | |
| template <class _Fp, class... _Vs> static void __make_fmatrix_impl() { | |
| __make_dispatch<_Fp, _Vs...>; | |
| } | |
| template <class _Fp, class... _Vs> static void __make_fmatrix() { | |
| __make_fmatrix_impl<_Fp, _Vs...>; | |
| } | |
| }; | |
| template <class> class __dtor; | |
| template <class... _Types> struct __dtor<__traits<_Types...>> { | |
| ~__dtor() { | |
| Trans_NS___visitation___base::__visit_alt([](auto) {}, this); | |
| } | |
| }; | |
| struct __move_constructor : __dtor<__traits<>> {}; | |
| struct __assignment : __move_constructor {}; | |
| struct __impl : __assignment {}; | |
| template <class> struct variant { | |
| __impl __impl_; | |
| }; | |
| } | |
| } | |
| export module std; | |
| export namespace std { | |
| using std::forward; | |
| using std::in_place; | |
| using std::in_place_t; | |
| using std::string; | |
| using std::variant; | |
| } | |
| //--- optional.cppm | |
| export module bopt.optional; | |
| import std; | |
| namespace bopt { | |
| template <class T> struct wrapper { | |
| template <class Func> wrapper(int, Func f) : value(std::forward(f)()) {} | |
| T value; | |
| }; | |
| template <class T> struct optional_base { | |
| struct union_t { | |
| T value_; | |
| }; | |
| struct repr { | |
| template <class OtherValue> | |
| repr(OtherValue) : un_{0, [] { return union_t{}; }} {} | |
| wrapper<union_t> un_; | |
| }; | |
| template <class... Args> | |
| optional_base(std::in_place_t, Args... args) : repr_{args...} {} | |
| repr repr_; | |
| }; | |
| export template <class T> struct optional : optional_base<T> { | |
| optional(); | |
| template <class U> optional(U) : optional_base<T>{std::in_place, 0} {} | |
| template <class U> constexpr void operator=(U) { | |
| [] {}; | |
| } | |
| }; | |
| } | |
| //--- date.format.cppm | |
| module ldgr:date.format; | |
| import bopt.optional; | |
| namespace ldgr { | |
| struct date_format { | |
| template <class S> static int parse(S s) { bopt::optional<int> year{s}; } | |
| }; | |
| } | |
| //--- annotated.cppm | |
| module ldgr:annotated; | |
| import std; | |
| import bopt.optional; | |
| struct lot_annotation { | |
| using valuation_expr_t = std::variant<std::string>; | |
| bopt::optional<valuation_expr_t> valuation_expr_; | |
| }; | |
| struct annotated_amount { | |
| lot_annotation lot_annotation_; | |
| }; | |
| //--- annotated.format.cppm | |
| module ldgr:annotated.format; | |
| import :date.format; | |
| import :annotated; | |
| namespace ldgr { | |
| struct annotated_format { | |
| static annotated_amount parse_default() { | |
| bopt::optional<int> date; | |
| date = date_format::parse(0); | |
| } | |
| }; | |
| } | |
| //--- date.test.cppm | |
| module ldgr:date.testlib; | |
| import :date.format; | |
| void date_from_string() { ldgr::date_format::parse(0); } | |
| //--- annotated.test.cpp | |
| // expected-no-diagnostics | |
| module ldgr:annotatedtest; | |
| import :annotated.format; | |
| import :date.testlib; | |
| int main() { ldgr::annotated_format::parse_default(); } |