public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "cvs-commit at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/12672] Evals template defaults args that it should not
Date: Tue, 31 Aug 2021 17:31:36 +0000	[thread overview]
Message-ID: <bug-12672-4-0Z9bLAuCdM@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-12672-4@http.gcc.gnu.org/bugzilla/>

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

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

https://gcc.gnu.org/g:f1e7319956928712e8bf4893ebdfeeb6441099ee

commit r12-3271-gf1e7319956928712e8bf4893ebdfeeb6441099ee
Author: Patrick Palka <ppalka@redhat.com>
Date:   Tue Aug 31 13:31:10 2021 -0400

    c++: check arity before deduction w/ explicit targs [PR12672]

    During overload resolution, when the arity of a function template
    clearly disagrees with the arity of the call, no specialization of the
    function template could yield a viable candidate.  The deduction routine
    type_unification_real already notices this situation, but not before
    it substitutes explicit template arguments into the template, a step
    which could induce a hard error.  Although it's necessary to perform
    this substitution first in order to check arity perfectly (since the
    substitution can e.g. expand a non-trailing parameter pack), in most
    cases we can determine ahead of time whether there's an arity
    disagreement without needing to perform deduction at all.

    To that end, this patch implements an (approximate) arity check in
    add_template_candidate_real that guards actual deduction.  It's enabled
    only when there are explicit template arguments since that's when
    deduction can force otherwise avoidable template instantiations.  (I
    experimented with enabling it unconditionally as an optimization, and
    observed some improvements to compile time of about 5% but also some
    slowdowns of about the same magnitude, so kept it conditional.)

    In passing, this adds a least_p parameter to arity_rejection for sake
    of consistent diagnostics with unify_arity.

    A couple of testcases needed to be adjusted so that deduction continues
    to occur as intended after this change.  Except in unify6.C, where we
    were expecting foo<void ()> to be ill-formed due to substitution
    forming a function type with an added 'const', but ISTM this is
    permitted by [dcl.fct]/7, so I changed the test accordingly.

            PR c++/12672

    gcc/cp/ChangeLog:

            * call.c (rejection_reason::call_varargs_p): Rename this
            previously unused member to ...
            (rejection_reason::least_p): ... this.
            (arity_rejection): Add least_p parameter.
            (add_template_candidate_real): When there are explicit
            template arguments, check that the arity of the call agrees with
            the arity of the function before attempting deduction.
            (print_arity_information): Add least_p parameter.
            (print_z_candidate): Adjust call to print_arity_information.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp0x/decltype29.C: Adjust.
            * g++.dg/template/error56.C: Adjust.
            * g++.old-deja/g++.pt/unify6.C: Adjust.
            * g++.dg/template/explicit-args7.C: New test.

  parent reply	other threads:[~2021-08-31 17:31 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bug-12672-4@http.gcc.gnu.org/bugzilla/>
2021-08-25 20:49 ` ppalka at gcc dot gnu.org
2021-08-31 17:31 ` cvs-commit at gcc dot gnu.org [this message]
2021-09-13 15:09 ` ppalka at gcc dot gnu.org
     [not found] <bug-12672-6594@http.gcc.gnu.org/bugzilla/>
2009-04-16 17:02 ` igodard at pacbell dot net
2003-10-18  8:24 [Bug c++/12672] New: " igodard at pacbell dot net
2003-10-18  8:26 ` [Bug c++/12672] " igodard at pacbell dot net
2003-10-18 11:28 ` igodard at pacbell dot net
2003-10-18 16:19 ` pinskia at gcc dot gnu dot org
2003-10-18 19:50 ` bangerth at dealii dot org
2003-12-28 22:13 ` pinskia at gcc dot gnu dot org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-12672-4-0Z9bLAuCdM@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).