[libcxx-commits] [PATCH] D119633: [libc++] Remove recursion in basic_string::insert(const_iterator, ForwardIterator, ForwardIterator)

Nikolas Klauser via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Tue Feb 15 08:58:47 PST 2022


philnik added a comment.

In D119633#3317770 <https://reviews.llvm.org/D119633#3317770>, @Quuxplusone wrote:

> I think this code looks correct enough, but it would be a lot less scary if you could just make `__addr_in_range` a non-constexpr function, instead of having it "lie" during constexpr evaluation and get us into infinite loops. E.g.:
>
>   if (__libcpp_is_constant_evaluated() || !__string_is_trivial_iterator<_ForwardIterator>::value || __addr_in_range(*__first)) {
>       // Make a copy and then insert from the copy.
>       const basic_string __temp(__first, __last, __alloc());
>       return __insert_from_safe_copy(__n, __ip, __temp.begin(), __temp.end());
>   } else {
>       return __insert_from_safe_copy(__n, __ip, __first, __last);
>   }
>
> Note that `__insert_from_safe_copy` might be a better name than `__insert_not_in_range`, because being overlapping is just //one// of the many failure modes we need to guard against here.
>
> Read (or re-read) https://quuxplusone.github.io/blog/2021/04/17/pathological-string-appends/ before deciding on this approach. "Burn the whole thing to the ground and rewrite it" //might// be a reasonable alternative, especially if the alternative is //increasing// the complexity of this already-complex code.

What would you like to see changed, other than the name? I don't really see a way to make this code simpler.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D119633



More information about the libcxx-commits mailing list