[libcxx-commits] [PATCH] D130854: [libc++][NFC] Qualify declaval

Nikolas Klauser via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Thu Aug 4 16:24:19 PDT 2022


philnik added a comment.

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

  /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;
                                                        ^
  /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<int, std::ratio<86400, 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: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;
                                                        ^
  /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<31556952, 1>>, std::chrono::duration<int, std::ratio<31556952, 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<31556952, 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:311:41: note: in instantiation of template class 'std::chrono::duration<int, std::ratio<31556952, 1>>' requested here
  typedef duration<     int, ratio_divide<years::period, ratio<12>>>           months;
                                          ^
  /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<int, std::ratio<31556952, 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:311:41: note: in instantiation of template class 'std::chrono::duration<int, std::ratio<31556952, 1>>' requested here
  typedef duration<     int, ratio_divide<years::period, ratio<12>>>           months;
                                          ^
  /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:53:66: error: no type named 'type' in 'std::common_type<long double, long double>'
      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 double, std::ratio<3600, 1>>, std::chrono::duration<long double, 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 double, 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:542:60: note: in instantiation of template class 'std::chrono::duration<long double, std::ratio<3600, 1>>' requested here
      constexpr chrono::duration<long double, ratio<3600,1>> operator""h(long double __h)
                                                             ^
  /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 double, 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:542:60: note: in instantiation of template class 'std::chrono::duration<long double, std::ratio<3600, 1>>' requested here
      constexpr chrono::duration<long double, ratio<3600,1>> operator""h(long double __h)
                                                             ^
  /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<60, 1>>, std::chrono::duration<long, std::ratio<60, 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<60, 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:548:31: note: in instantiation of template class 'std::chrono::duration<long, std::ratio<60, 1>>' requested here
      constexpr chrono::minutes operator""min(unsigned long long __m)
                                ^
  /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<60, 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:548:31: note: in instantiation of template class 'std::chrono::duration<long, std::ratio<60, 1>>' requested here
      constexpr chrono::minutes operator""min(unsigned long long __m)
                                ^
  /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:53:66: error: no type named 'type' in 'std::common_type<long double, long double>'
      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 double, std::ratio<60, 1>>, std::chrono::duration<long double, std::ratio<60, 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 double, std::ratio<60, 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:553:58: note: in instantiation of template class 'std::chrono::duration<long double, std::ratio<60, 1>>' requested here
      constexpr chrono::duration<long double, ratio<60,1>> operator""min(long double __m)
                                                           ^
  /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 double, std::ratio<60, 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:553:58: note: in instantiation of template class 'std::chrono::duration<long double, std::ratio<60, 1>>' requested here
      constexpr chrono::duration<long double, ratio<60,1>> operator""min(long double __m)
                                                           ^
  /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, 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 long>, std::chrono::duration<long long>>' 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 long>>' 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:559:31: note: in instantiation of template class 'std::chrono::duration<long long>' requested here
      constexpr chrono::seconds operator""s(unsigned long long __s)
                                ^
  /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 long>>'
      _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:559:31: note: in instantiation of template class 'std::chrono::duration<long long>' requested here
      constexpr chrono::seconds operator""s(unsigned long long __s)
                                ^
  /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:53:66: error: no type named 'type' in 'std::common_type<long double, long double>'
      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 double>, std::chrono::duration<long double>>' 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 double>>' 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:564:45: note: in instantiation of template class 'std::chrono::duration<long double>' requested here
      constexpr chrono::duration<long double> operator""s(long double __s)
                                              ^
  /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 double>>'
      _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:564:45: note: in instantiation of template class 'std::chrono::duration<long double>' requested here
      constexpr chrono::duration<long double> operator""s(long double __s)
                                              ^
  /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, 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 long, std::ratio<1, 1000>>, std::chrono::duration<long long, std::ratio<1, 1000>>>' 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 long, std::ratio<1, 1000>>>' 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:570:36: note: in instantiation of template class 'std::chrono::duration<long long, std::ratio<1, 1000>>' requested here
      constexpr chrono::milliseconds operator""ms(unsigned long long __ms)
                                     ^
  /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 long, std::ratio<1, 1000>>>'
      _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:570:36: note: in instantiation of template class 'std::chrono::duration<long long, std::ratio<1, 1000>>' requested here
      constexpr chrono::milliseconds operator""ms(unsigned long long __ms)
                                     ^
  /home/nikolask/llvm-projects/libcxx/build/include/c++/v1/__chrono/duration.h:53:66: error: no type named 'type' in 'std::common_type<long double, long double>'
      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 double, std::ratio<1, 1000>>, std::chrono::duration<long double, std::ratio<1, 1000>>>' 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 double, std::ratio<1, 1000>>>' 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:575:52: note: in instantiation of template class 'std::chrono::duration<long double, std::ratio<1, 1000>>' requested here
      constexpr chrono::duration<long double, milli> operator""ms(long double __ms)
                                                     ^
  fatal error: too many errors emitted, stopping now [-ferror-limit=]
  /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>
   ~~~~~~~~^
  21 errors generated.

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.



================
Comment at: libcxx/include/__utility/declval.h:30
 template <class _Tp>
-decltype(__declval<_Tp>(0)) declval() _NOEXCEPT;
+decltype(std::__declval<_Tp>(0)) declval() _NOEXCEPT;
 
----------------
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?


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