================ @@ -14,16 +14,30 @@ #include <__type_traits/decay.h> #include <__type_traits/is_same.h> #include <__type_traits/remove_cvref.h> +#include <__type_traits/type_identity.h> #include <__type_traits/void_t.h> #include <__utility/declval.h> +#include <__utility/empty.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif _LIBCPP_BEGIN_NAMESPACE_STD -#if _LIBCPP_STD_VER >= 20 +#if __has_builtin(__builtin_common_type) + +template <class... _Args> +struct common_type; + +template <class... _Args> +using __common_type_t = typename common_type<_Args...>::type; + +template <class... _Args> +struct common_type : __builtin_common_type<__common_type_t, __type_identity, __empty, _Args...> {}; ---------------- ldionne wrote:
@philnik777 This causes a problem when modules are enabled, because we'd have to export `__builtin_common_type` from this module but I don't think there's any way of doing that. That leads to errors of this kind: ``` # | In module 'std' imported from /llvm/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.destr/dtor.pass.cpp:19: # | /llvm/build-runtimes/libcxx/test-suite-install/include/c++/v1/__chrono/duration.h:90:101: error: no type named 'type' in 'std::common_type<long double, long double, long>' # | 90 | typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; # | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~ # | /llvm/build-runtimes/libcxx/test-suite-install/include/c++/v1/__chrono/duration.h:107:10: note: in instantiation of member function 'std::chrono::__duration_cast<std::chrono::duration<long double>, std::chrono::duration<long double, std::ratio<1, 1000>>>::operator()' requested here # | 107 | return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd); # | | ^ # | /llvm/build-runtimes/libcxx/test-suite-install/include/c++/v1/__chrono/duration.h:220:24: note: in instantiation of function template specialization 'std::chrono::duration_cast<std::chrono::duration<long double, std::ratio<1, 1000>>, long double, std::ratio<1>, 0>' requested here # | 220 | : __rep_(chrono::duration_cast<duration>(__d).count()) {} # | | ^ # | /llvm/build-runtimes/libcxx/test-suite-install/include/c++/v1/__chrono/duration.h:385:33: note: in instantiation of function template specialization 'std::chrono::duration<long double, std::ratio<1, 1000>>::duration<long double, std::ratio<1>, 0>' requested here # | 385 | return _Ct(__lhs).count() <=> _Ct(__rhs).count(); # | | ^ # | /llvm/build-runtimes/libcxx/test-suite-install/include/c++/v1/__thread/this_thread.h:45:13: note: in instantiation of function template specialization 'std::chrono::operator<=><long long, std::ratio<1, 1000>, long double, std::ratio<1>>' requested here # | 45 | if (__d < __max) { # | | ^ # | /llvm/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.destr/dtor.pass.cpp:63:29: note: in instantiation of function template specialization 'std::this_thread::sleep_for<long long, std::ratio<1, 1000>>' requested here # | 63 | std::this_thread::sleep_for(std::chrono::milliseconds(250)); # | | ^ # | 1 error generated. ``` This didn't show up in the CI here because the modules CI doesn't run against Clang trunk. https://github.com/llvm/llvm-project/pull/99473 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits