https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119748

--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jonathan Wakely <r...@gcc.gnu.org>:

https://gcc.gnu.org/g:05d3aebe24be1177851574ab224f16492c5050fd

commit r15-9478-g05d3aebe24be1177851574ab224f16492c5050fd
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Fri Apr 11 22:13:14 2025 +0100

    libstdc++: Fix std::string construction from volatile char* [PR119748]

    My recent r15-9381-g648d5c26e25497 change assumes that a contiguous
    iterator with the correct value_type can be converted to a const charT*
    but that's not true for volatile charT*. The optimization should only be
    done if it can be converted to the right pointer type.

    Additionally, some generic loops for non-contiguous iterators need an
    explicit cast to deal with iterator reference types that do not bind to
    the const charT& parameter of traits_type::assign.

    libstdc++-v3/ChangeLog:

            PR libstdc++/119748
            * include/bits/basic_string.h (_S_copy_chars): Only optimize for
            contiguous iterators that are convertible to const charT*. Use
            explicit conversion to charT after dereferencing iterator.
            (_S_copy_range): Likewise for contiguous ranges.
            * include/bits/basic_string.tcc (_M_construct): Use explicit
            conversion to charT after dereferencing iterator.
            * include/bits/cow_string.h (_S_copy_chars): Likewise.
            (basic_string(from_range_t, R&&, const Allocator&)): Likewise.
            Only optimize for contiguous iterators that are convertible to
            const charT*.
            * testsuite/21_strings/basic_string/cons/char/119748.cc: New
            test.
            * testsuite/21_strings/basic_string/cons/wchar_t/119748.cc:
            New test.

    Reviewed-by: Tomasz Kaminski <tkami...@redhat.com>

Reply via email to