c++: non-dependent immediate member fn call [PR99895]
authorPatrick Palka <ppalka@redhat.com>
Thu, 27 Jan 2022 15:56:49 +0000 (10:56 -0500)
committerPatrick Palka <ppalka@redhat.com>
Thu, 27 Jan 2022 15:56:49 +0000 (10:56 -0500)
commitdec8d0e5fa00ceb2ded78b8a3eba8976d860a90e
tree46e912a46c6c9af56ad5822f06098a7aca16a31b
parentce6054a22ae14594a2919d2ad87cd9478e616fb3
c++: non-dependent immediate member fn call [PR99895]

Here we're emitting a bogus error during ahead of time evaluation of a
non-dependent immediate member function call such as a.f(args) because
the defacto templated form for such a call is (a.f)(args) but we're
trying to evaluate it using the intermediate CALL_EXPR built by
build_over_call, which has the non-member form f(a, args).  The defacto
member form is built in build_new_method_call, so it seems we should
handle the immediate call there instead, or perhaps make build_over_call
build the correct form in the first place.

Giiven that there are many spots other than build_new_method_call that
call build_over_call for member functions, e.g. build_op_call, this
patch takes the latter approach.

In passing, this patch makes us avoid wrapping PARM_DECL in
NON_DEPENDENT_EXPR for benefit of the third testcase below.

PR c++/99895

gcc/cp/ChangeLog:

* call.cc (build_over_call): For a non-dependent member call,
build up a CALL_EXPR using a COMPONENT_REF callee, as in
build_new_method_call.
* pt.cc (build_non_dependent_expr): Don't wrap PARM_DECL either.
* tree.cc (build_min_non_dep_op_overload): Adjust accordingly
after the build_over_call change.

gcc/ChangeLog:

* tree.cc (build_call_vec): Add const to second parameter.
* tree.h (build_call_vec): Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/consteval-memfn1.C: New test.
* g++.dg/cpp2a/consteval-memfn2.C: New test.
* g++.dg/cpp2a/consteval28.C: New test.
gcc/cp/call.cc
gcc/cp/pt.cc
gcc/cp/tree.cc
gcc/testsuite/g++.dg/cpp2a/consteval-memfn1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/consteval-memfn2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/consteval28.C [new file with mode: 0644]
gcc/tree.cc
gcc/tree.h