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

            Bug ID: 120259
           Summary: Using Incomplete&& as argument in
                    invoke_r/move_only_function fails to compile
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tkaminsk at gcc dot gnu.org
  Target Milestone: ---

Passing rvalue reference to incomplete type or instantiating move_only_function
with it as parameter produces ill-formed program.
```
struct Incomplete;
int foo(Incomplete& i);
void bar(Incomplete& i) {
    std::invoke_r<int>(&foo, std::move(i)); // ILL-FORMED
    std::move_only_function<int(Incomplete&&)> mo(&foo);  // ILL-FORMED
}
```
See: https://godbolt.org/z/GvW7veGKa

The error produced is:
/opt/compiler-explorer/gcc-12.1.0/include/c++/12.1.0/type_traits:3055:53:
error: static assertion failed: each argument type must be a complete class or
an unbounded array
 3055 |       static_assert((std::__is_complete_or_unbounded(
      |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
 3056 |         __type_identity<_ArgTypes>{}) && ...),
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                

The failure in `move_only_function` is due instantiation of std::invoke_r.

Reply via email to