[libcxx-commits] [PATCH] D130854: [libc++][NFC] Qualify declaval
Mark de Wever via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Sat Aug 6 08:22:02 PDT 2022
Mordante accepted this revision.
Mordante added a comment.
This revision is now accepted and ready to land.
LGTM, but I spotted one more missing `std`.
In D130854#3701255 <https://reviews.llvm.org/D130854#3701255>, @philnik wrote:
> I don't know if this should go into the commit message. It's a bit wordy.
> When removing qualifications and the include from `__type_traits/common_type.h`, running `std/utilities/meta/meta.trans/meta.trans.other/common_type.pass.cpp` results in
Maybe something like
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:53:66: error: no type named 'type' in 'std::common_type<long, long>'
> typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type,
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__type_traits/common_type.h:107:14: note: in instantiation of template class 'std::common_type<std::chrono::duration<long, std::ratio<3600, 1>>, std::chrono::duration<long, std::ratio<3600, 1>>>' requested here
> : public common_type<_Tp, _Tp> {};
> ^
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:279:58: note: in instantiation of template class 'std::common_type<std::chrono::duration<long, std::ratio<3600, 1>>>' requested here
> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator+() const {return typename common_type<duration>::type(*this);}
> ^
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:308:54: note: in instantiation of template class 'std::chrono::duration<long, std::ratio<3600, 1>>' requested here
> typedef duration< int, ratio_multiply<ratio<24>, hours::period>> days;
> ^
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:280:81: error: no type named 'type' in 'std::common_type<std::chrono::duration<long, std::ratio<3600, 1>>>'
> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator-() const {return typename common_type<duration>::type(-__rep_);}
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:308:54: note: in instantiation of template class 'std::chrono::duration<long, std::ratio<3600, 1>>' requested here
> typedef duration< int, ratio_multiply<ratio<24>, hours::period>> days;
> ^
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:53:66: error: no type named 'type' in 'std::common_type<int, int>'
> typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type,
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__type_traits/common_type.h:107:14: note: in instantiation of template class 'std::common_type<std::chrono::duration<int, std::ratio<86400, 1>>, std::chrono::duration<int, std::ratio<86400, 1>>>' requested here
> : public common_type<_Tp, _Tp> {};
> ^
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:279:58: note: in instantiation of template class 'std::common_type<std::chrono::duration<int, std::ratio<86400, 1>>>' requested here
> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator+() const {return typename common_type<duration>::type(*this);}
> ^
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:309:55: note: in instantiation of template class 'std::chrono::duration<int, std::ratio<86400, 1>>' requested here
> typedef duration< int, ratio_multiply<ratio<7>, days::period>> weeks;
> ^
> 19 similar errors omitted
>
> Adding qualifications results in
>
> While building module 'std' imported from /home/nikolask/llvm-projects/libcxx/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/common_type.pass.cpp:13:
> In file included from <module-includes>:17:
> In file included from /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/math.h:309:
> In file included from /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/limits:107:
> In file included from /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/type_traits:432:
> In file included from /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__type_traits/common_reference.h:13:
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__type_traits/common_type.h:28:43: error: declaration of 'declval' must be imported from module 'std.utility.__utility.declval' before it is required
> using __cond_type = decltype(false ? std::declval<_Tp>() : std::declval<_Up>());
> ^
> /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__utility/declval.h:30:34: note: declaration here is not visible
> decltype(std::__declval<_Tp>(0)) declval() _NOEXCEPT;
> ^
> /home/nikolask/llvm-projects/libcxx/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/common_type.pass.cpp:13:10: fatal error: could not build module 'std'
> #include <functional>
> ~~~~~~~~^
> 2 errors generated.
Both have 2 errors and I really prefer the latter... especially since there were 21 instead of 2 before.
This is really a nice improvement for the error messages.
================
Comment at: libcxx/include/__memory/allocator_traits.h:214
struct __has_max_size<_Alloc, decltype(
(void)declval<_Alloc&>().max_size()
)> : true_type { };
----------------
================
Comment at: libcxx/include/__utility/declval.h:30
template <class _Tp>
-decltype(__declval<_Tp>(0)) declval() _NOEXCEPT;
+decltype(std::__declval<_Tp>(0)) declval() _NOEXCEPT;
----------------
philnik wrote:
> Mordante wrote:
> > This looks off, you only ADL-proved the call to `__declval`. (This isn't needed, but I don't object against this change.)
> Are you asking for something? What else should I have ADL-proofed here?
Nevermind I misread, this `declval` shouldn't be `std::declval`.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D130854/new/
https://reviews.llvm.org/D130854
More information about the libcxx-commits
mailing list