[PATCH] D152003: [clang] Fix `static_cast` to array of unknown bound

Mark de Wever via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 26 08:35:56 PDT 2023


Mordante added a subscriber: var-const.
Mordante added a comment.

In D152003#4534963 <https://reviews.llvm.org/D152003#4534963>, @Fznamznon wrote:

>> What do you mean with libstdc++ is fine?
>
> What I mean is when I do (current patch is applied to clang):
>
>   source/llvm-project/build/bin/clang++ -std=c++20 t.cpp -c // compilation succeeds

I see what you mean now.

> What I'm seeing is that in libc++ there is a bunch of explicit static casts in `ranges::__crend::__fn` that endup transformed:
>
>   namespace ranges {
>   namespace __crend {                                                                    
>   struct __fn {
>     template <class _Tp>
>       requires is_lvalue_reference_v<_Tp&&>                                              
>     [[nodiscard]] _LIBCPP_HIDE_FROM_ABI
>     constexpr auto operator()(_Tp&& __t) const
>       noexcept(noexcept(ranges::rend(static_cast<const remove_reference_t<_Tp>&>(__t))))
>       -> decltype(      ranges::rend(static_cast<const remove_reference_t<_Tp>&>(__t)))  
>       { return          ranges::rend(static_cast<const remove_reference_t<_Tp>&>(__t)); }
>                                                                                          
>     template <class _Tp>                                                                 
>       requires is_rvalue_reference_v<_Tp&&>                                              
>     [[nodiscard]] _LIBCPP_HIDE_FROM_ABI
>     constexpr auto operator()(_Tp&& __t) const
>       noexcept(noexcept(ranges::rend(static_cast<const _Tp&&>(__t))))                    
>       -> decltype(      ranges::rend(static_cast<const _Tp&&>(__t)))
>       { return          ranges::rend(static_cast<const _Tp&&>(__t)); }
>   };
>   } // namespace __crend
>
> Is that expected?

I'm not very familiar with ranges but looking at the standard the `static_cast` is not required. I don't think the original author intended this behaviour which you implement in this patch. (To be honest I'm a bit surprised by this change in the language. I wonder how many other (library) developers it will catch off-guard.)

I agree this is a bug in libc++ and we should fix it. As mentioned I'm not too familiar with ranges. Maybe @var-const has time, otherwise 
we need to wait for @philnik.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152003/new/

https://reviews.llvm.org/D152003



More information about the cfe-commits mailing list