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

            Bug ID: 112908
           Summary: __reference_{converts,constructs}_from_temporary
                    checks for move constructor when binding prvalue to
                    reference of the same type
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mital at mitalashok dot co.uk
  Target Milestone: ---

The following compiles on trunk:

    struct NonMovable {
      NonMovable() = default;
      NonMovable(NonMovable&&) = delete;
    };

    static_assert( __reference_converts_from_temporary(int&&, int));
    static_assert(!__reference_converts_from_temporary(NonMovable&&,
NonMovable));
    static_assert( __reference_constructs_from_temporary(int&&, int));
    static_assert(!__reference_constructs_from_temporary(NonMovable&&,
NonMovable));

When the NonMovable assertions should fail because there *is* a temporary being
bound to a reference (in exactly the same way as the int case).

We can observe it instantiating constructors that shouldn't be too:

    template<typename T>
    struct S {
      template<typename U = T>
      S(const S&&) noexcept(U()) {}
    };

    static_assert(__reference_converts_from_temporary(const S<bool>&&, const
S<bool>));
    static_assert(__reference_converts_from_temporary(const S<void*>&&, const
S<void*>));

Which complains about a conversion from void* to bool even though constructors
shouldn't be looked at.

Reply via email to