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

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

https://gcc.gnu.org/g:1b265d910f27743dc3ea8e4fde6c292df220fb9f

commit r9-9456-g1b265d910f27743dc3ea8e4fde6c292df220fb9f
Author: Patrick Palka <ppa...@redhat.com>
Date:   Tue Feb 23 09:40:09 2021 -0500

    c++: Fix folding of non-dependent BASELINKs [PR95468]

    Here, the problem ultimately seems to be that tsubst_copy_and_build,
    when called with empty args as we do during non-dependent expression
    folding, doesn't touch BASELINKs at all: it delegates to tsubst_copy
    which then immediately exits early due to the empty args.  This means
    that the CAST_EXPR int(1) in the BASELINK A::condition<int(1)> never
    gets folded (as part of folding of the overall CALL_EXPR), which later
    causes us to crash when performing overload resolution of the rebuilt
    CALL_EXPR (which is still in terms of this templated BASELINK).

    This doesn't happen when condition() is a namespace-scope function
    because then condition<int(1)> is represented by a TEMPLATE_ID_EXPR
    rather than by a BASELINK, which does get handled directly from
    tsubst_copy_and_build.

    This patch fixes this issue by having tsubst_copy_and_build handle
    BASELINK directly rather than delegating to tsubst_copy, so that it
    processes BASELINKs even when args is empty.

    gcc/cp/ChangeLog:

            PR c++/95468
            * pt.c (tsubst_copy_and_build) <case BASELINK>: New case, copied
            over from tsubst_copy.

    gcc/testsuite/ChangeLog:

            PR c++/95468
            * g++.dg/template/non-dependent15.C: New test.

    (cherry picked from commit 5bd7afb71fca3a5a6e9f8586d86903bae1849193)

Reply via email to