[Bug c++/99963] [11 Regression] [concepts] template <concept> vs concept auto reports ambiguous overload

ppalka at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Apr 14 15:41:08 GMT 2021


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

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jason at gcc dot gnu.org,
                   |                            |ppalka at gcc dot gnu.org
   Target Milestone|---                         |11.0
            Summary|[concepts] template         |[11 Regression] [concepts]
                   |<concept> vs concept auto   |template <concept> vs
                   |reports ambiguous overload  |concept auto reports
                   |                            |ambiguous overload

--- Comment #1 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Started with r11-1571.  Reduced testcase that replaces the abbreviated function
templates with their corresponding non-abbreviated forms:

template <class T> concept C1 = true;
template <class T> concept C2 = C1<T> && true;

template <C1 T, C1 U> int f(T, U);
template <C1 T, C2 U> int f(U, T);

int x = f(0, 0); // error: ambiguous call


If I understand the wording of P2113 correctly:

  If deduction against the other template succeeds for both transformed
templates, constraints can be considered as follows:
  - ... if the corresponding template-parameters of the
template-parameter-lists are not equivalent ([temp.over.link]) or if the
function parameters that positionally correspond between the two templates are
not of the same type, neither template is more specialized than the other

then I think we're correct to reject the call as ambiguous because although the
second overload is more constrained than the first, their function parameter
lists aren't equivalent.


More information about the Gcc-bugs mailing list