// RUN: rm -rf %t // RUN: mkdir %t // RUN: split-file %s %t // RUN: mkdir %t/tmp // // RUN: %clang_cc1 -std=c++23 -nostdinc++ -I %t/std %t/wrap.std.tt.cppm -emit-reduced-module-interface -o %t/wrap.std.tt.pcm // RUN: %clang_cc1 -std=c++23 -nostdinc++ -I %t/std %t/wrap.std.vec.cppm -emit-reduced-module-interface -o %t/wrap.std.vec.pcm // RUN: %clang_cc1 -std=c++23 -nostdinc++ -I %t/std %t/not_std.cppm -emit-reduced-module-interface -o %t/not_std.pcm // RUN: %clang_cc1 -std=c++23 -nostdinc++ -I %t/std %t/wrap.std.tt2.cppm -emit-reduced-module-interface -o %t/wrap.std.tt2.pcm // RUN: %clang_cc1 -std=c++23 -nostdinc++ -I %t/std -fmodule-file=wrap.std.vec=%t/wrap.std.vec.pcm %t/wrap.std.vec.reexport.cppm -emit-reduced-module-interface -o %t/wrap.std.vec.reexport.pcm // RUN: %clang_cc1 -std=c++23 -nostdinc++ -I %t/std -fmodule-file=wrap.std.tt=%t/wrap.std.tt.pcm -fmodule-file=wrap.std.vec=%t/wrap.std.vec.pcm -fmodule-file=wrap.std.vec.reexport=%t/wrap.std.vec.reexport.pcm -fmodule-file=wrap.std.tt2=%t/wrap.std.tt2.pcm -fmodule-file=not_std=%t/not_std.pcm %t/k.repro_dep.cppm -emit-reduced-module-interface -o %t/k.repro_dep.pcm // RUN: %clang_cc1 -std=c++23 -nostdinc++ -I %t/std -fmodule-file=wrap.std.tt=%t/wrap.std.tt.pcm -fmodule-file=wrap.std.vec=%t/wrap.std.vec.pcm -fmodule-file=wrap.std.tt2=%t/wrap.std.tt2.pcm -fmodule-file=wrap.std.vec.reexport=%t/wrap.std.vec.reexport.pcm -fmodule-file=not_std=%t/not_std.pcm -fmodule-file=k.repro_dep=%t/k.repro_dep.pcm %t/k.repro.cxx -fsyntax-only -verify //--- std/allocator.h #ifndef _LIBCPP___MEMORY_ALLOCATOR_H #define _LIBCPP___MEMORY_ALLOCATOR_H #include namespace std { enum align_val_t { __zero = 0, __max = (size_t)-1 }; template inline _Tp* __libcpp_allocate(size_t __n, [[__maybe_unused__]] size_t __align = 8) { size_t __size = static_cast(__n) * sizeof(_Tp); return static_cast<_Tp*>(__builtin_operator_new(__size, static_cast(__align))); } template class allocator { public: typedef _Tp value_type; [[__nodiscard__]] _Tp* allocate(size_t __n) { if (__builtin_is_constant_evaluated()) { return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); } else { return std::__libcpp_allocate<_Tp>(size_t(__n)); } } }; template inline bool operator==(const allocator<_Tp>&, const allocator<_Up>&) noexcept { return true; } } #endif // _LIBCPP___MEMORY_ALLOCATOR_H //--- std/sys_wchar.h #ifndef _WCHAR_H #define _WCHAR_H 1 #ifndef __FILE_defined #define __FILE_defined 1 struct _IO_FILE; typedef struct _IO_FILE FILE; #endif #endif /* wchar.h */ //--- std/char_traits.h #ifndef _LIBCPP___STRING_CHAR_TRAITS_H #define _LIBCPP___STRING_CHAR_TRAITS_H namespace std { template inline size_t constexpr __constexpr_strlen(const _Tp* __str) noexcept { if (__builtin_is_constant_evaluated()) { size_t __i = 0; for (; __str[__i] != '\0'; ++__i) ; return __i; } return 0; } template struct char_traits; template <> struct char_traits { using char_type = char; [[__nodiscard__]] static inline size_t constexpr length(const char_type* __s) noexcept { return std::__constexpr_strlen(__s); } }; } #endif // _LIBCPP___STRING_CHAR_TRAITS_H //--- std/type_traits #ifndef _LIBCPP_TYPE_TRAITS #define _LIBCPP_TYPE_TRAITS namespace std {} #endif // _LIBCPP_TYPE_TRAITS //--- std/ptrdiff_t.h #ifndef _LIBCPP___CSTDDEF_PTRDIFF_T_H #define _LIBCPP___CSTDDEF_PTRDIFF_T_H namespace std { using ptrdiff_t = decltype(static_cast(nullptr) - static_cast(nullptr)); } #endif // _LIBCPP___CSTDDEF_PTRDIFF_T_H //--- std/size_t.h #ifndef _LIBCPP___CSTDDEF_SIZE_T_H #define _LIBCPP___CSTDDEF_SIZE_T_H namespace std { using size_t = decltype(sizeof(int)); } #endif // _LIBCPP___CSTDDEF_SIZE_T_H //--- wrap.std.tt.cppm module; #include export module wrap.std.tt; //--- wrap.std.vec.cppm module; #include #include export module wrap.std.vec; //--- not_std.cppm module; #include export module not_std; namespace std { template class __split_buffer { public: __split_buffer() { _Allocator a; (void)a.allocate(1); } }; } export namespace std { template using problem = std::__split_buffer>; } export using ::operator new; //--- wrap.std.tt2.cppm module; #include export module wrap.std.tt2; //--- wrap.std.vec.reexport.cppm export module wrap.std.vec.reexport; export import wrap.std.vec; //--- k.repro_dep.cppm module; #include #include #include export module k.repro_dep; import wrap.std.tt; import wrap.std.vec.reexport; import wrap.std.vec; import wrap.std.tt2; import not_std; using XYZ = std::char_traits; //--- k.repro.cxx // expected-no-diagnostics import not_std; import k.repro_dep; auto f() -> void { std::problem< int > x; }