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

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppa...@gcc.gnu.org>:

https://gcc.gnu.org/g:59e0376f607805ef9b67fd7b0a4a3084ab3571a5

commit r13-5684-g59e0376f607805ef9b67fd7b0a4a3084ab3571a5
Author: Patrick Palka <ppa...@redhat.com>
Date:   Fri Feb 3 09:41:10 2023 -0500

    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.

Reply via email to