]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: unexpected ADDR_EXPR after overload set pruning [PR107461]
authorPatrick Palka <ppalka@redhat.com>
Fri, 3 Feb 2023 14:41:10 +0000 (09:41 -0500)
committerPatrick Palka <ppalka@redhat.com>
Fri, 3 Feb 2023 14:43:14 +0000 (09:43 -0500)
commit534aea1ca7e7538dc6af3eac3cd2ec6c7343fdee
tree8630caa4ecf89619996242867b6baab1417222b6
parenta91c0d054c898ce6fd9175315d4e6b1daaae6344
c++: unexpected ADDR_EXPR after overload set pruning [PR107461]

Here the ahead-of-time overload set pruning in finish_call_expr is
unintentionally returning a CALL_EXPR whose (pruned) callee is wrapped
in an ADDR_EXPR, despite the original callee not being wrapped in an
ADDR_EXPR.  This ends up causing a bogus declaration mismatch error in
the below testcase because the call to min in #1 gets expressed as a
CALL_EXPR of ADDR_EXPR of FUNCTION_DECL, whereas the level-lowered call
to min in #2 gets expressed instead as a CALL_EXPR of FUNCTION_DECL.

This patch fixes this by stripping the spurious ADDR_EXPR appropriately.
Thus the first call to min now also gets expressed as a CALL_EXPR of
FUNCTION_DECL, matching the behavior before r12-6075-g2decd2cabe5a4f.

PR c++/107461

gcc/cp/ChangeLog:

* semantics.cc (finish_call_expr): Strip ADDR_EXPR from
the selected callee during overload set pruning.

gcc/testsuite/ChangeLog:

* g++.dg/template/call9.C: New test.

(cherry picked from commit 59e0376f607805ef9b67fd7b0a4a3084ab3571a5)
gcc/cp/semantics.cc
gcc/testsuite/g++.dg/template/call9.C [new file with mode: 0644]