[Bug c++/112908] __reference_{converts,constructs}_from_temporary checks for move constructor when binding prvalue to reference of the same type

"cvs-commit at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112908

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Marek Polacek <[email protected]>:

https://gcc.gnu.org/g:83a903f339af9a1ecde675261191cc69e7b1b721

commit r17-2665-g83a903f339af9a1ecde675261191cc69e7b1b721
Author: Marek Polacek <[email protected]>
Date:   Tue Jul 21 12:59:40 2026 -0400

    c++: implement LWG 3819, reference_xes_from_temporary [PR112908]

    This is an attempt to implement
<https://cplusplus.github.io/LWG/issue3819>.

    My understanding of this issue is that previously, ref_xes_from_temporary
    was defined by using is_constructible, which is implemented by seeing
    if
      T t(declval<Args>()...);
    is well-formed.  But declval always yields an xvalue, never a prvalue.
    In practice this means that for

        struct U {
          U();
          U(U&&) = delete;
        };

        struct T {
          T(U);
        };

    reference_constructs_from_temporary_v<const T&, U> is false due
    to the deleted move ctor.  But if we have a prvalue, then the
    call to the move ctor should be elided and so it doesn't matter
    that it's deleted.  So the result should be 'true'.

    Our ref_xes_from_temporary already doesn't check is_constructible<T, U>
    as the comment says, but we always use build_trait_object which
    gives us an xvalue.  What we need is to implement [meta.unary.prop]/5.2:
    Otherwise [not a reference or function type], VAL<T> is a prvalue that
    initially has type T.  For this I've added build_prvalue_trait_object.

    The finish_trait_expr change is so that get_target_expr doesn't crash
    on an incomplete type.  This change should be correct since
    https://cplusplus.github.io/LWG/issue2939 didn't adjust
    reference_xes_from_temporary the same way as is_convertible/constructible.

            PR c++/112908

    gcc/cp/ChangeLog:

            * method.cc (build_prvalue_trait_object): New.
            (ref_xes_from_temporary): Use build_prvalue_trait_object.
            Use deferring_access_check_sentinel and cp_unevaluated.  Don't
            call force_rvalue or rvalue.
            * semantics.cc (finish_trait_expr)
            <case CPTK_REF_CONSTRUCTS_FROM_TEMPORARY>: Actually check
            completeness.

    gcc/testsuite/ChangeLog:

            * g++.dg/ext/is_constructible8.C: Move
            __reference_*_from_temporary testing to a new test.
            * g++.dg/ext/reference_xes_from_temporary2.C: New test.
            * g++.dg/ext/reference_xes_from_temporary3.C: New test.

    Reviewed-by: Jason Merrill <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.