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

            Bug ID: 121761
           Summary: [13/14/15/16 Regression] std::pair deduction guide
                    doesn't decay functions in C++20 mode
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

#include <utility>
void func() {}
std::pair p(func, 1);
std::pair<void (*)(), int>& r = p;

This fails to compile with -std=gnu++20


In file included from /home/jwakely/gcc/16/include/c++/16.0.0/utility:71,
                 from pair.cc:1:
/home/jwakely/gcc/16/include/c++/16.0.0/bits/stl_pair.h: In instantiation of
'struct std::pair<void(), int>':
required by substitution of 'template<class _T1, class _T2> pair(const _T1&,
const _T2&) -> std::pair<_T1, _T2> requires (std::pair<_T1,
_T2>::_S_constructible<const _T1&, const _T2&>)() [with _T1 = void(); _T2 =
int]'
/home/jwakely/gcc/16/include/c++/16.0.0/bits/stl_pair.h:450:57:   
  450 |       requires (_S_constructible<const _T1&, const _T2&>())
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
required from here
pair.cc:3:20:   
    3 | std::pair p(func, 1);
      |                    ^
/home/jwakely/gcc/16/include/c++/16.0.0/bits/stl_pair.h:308:11: error: data
member 'std::pair<void(), int>::first' invalidly declared function type
  308 |       _T1 first;                 ///< The first member
      |           ^~~~~


There's a deduction guide that should decay the function to a pointer:

#if __cpp_deduction_guides >= 201606
  template<typename _T1, typename _T2> pair(_T1, _T2) -> pair<_T1, _T2>;
#endif

But the error shows that we're trying to instantiate pair<void(&)(), int>.

This is caused by the concepts-based implementation, which was added in GCC 12.
Before that the same code was used in C++20 mode as for C++17 mode, and the
decaying works correctly.

Reply via email to