c++: make finish_non_static_data_member SFINAE enabled [PR105351]
commita16fc9f1c96c7361d0b7a83a06f3649ace6c440d
authorPatrick Palka <ppalka@redhat.com>
Tue, 3 May 2022 19:21:26 +0000 (3 15:21 -0400)
committerPatrick Palka <ppalka@redhat.com>
Tue, 3 May 2022 19:21:26 +0000 (3 15:21 -0400)
tree01f249f3cd129ae610347d2ac1d0d4d9cd195a61
parent5609bcd620132c290820cccd871a6d7cbf39b785
c++: make finish_non_static_data_member SFINAE enabled [PR105351]

Here since finish_non_static_data_member isn't SFINAE enabled, we
incorrectly emit an error when considering the first overload rather
than silently discarding it:

sfinae33.C: In substitution of ‘template<class T> A<T::value> f() [with T = B]’:
sfinae33.C:11:7:   required from here
sfinae33.C:5:31: error: invalid use of non-static data member ‘B::value’
    5 | template<class T> A<T::value> f();
      |                               ^

This patch makes the function SFINAE enabled in the usual way: give it a
complain parameter, check it before emitting an error, and pass it through
appropriately.

PR c++/105351

gcc/cp/ChangeLog:

* cp-tree.h (finish_non_static_data_member): Add defaulted
complain parameter.
* pt.cc (tsubst_copy_and_build): Pass complain to
finish_non_static_data_member.
* semantics.cc (finish_non_static_data_member): Respect complain
parameter.
(finish_qualified_id_expr): Pass complain to
finish_non_static_data_member.

gcc/testsuite/ChangeLog:

* g++.dg/template/sfinae33.C: New test.
gcc/cp/cp-tree.h
gcc/cp/pt.cc
gcc/cp/semantics.cc
gcc/testsuite/g++.dg/template/sfinae33.C [new file with mode: 0644]