Patrick Palka f1e7319956 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.
2021-08-31 13:31:10 -04:00
2021-07-22 00:16:46 +00:00
2021-08-19 00:16:42 +00:00
2021-08-31 00:16:50 +00:00
2021-08-31 00:16:50 +00:00
2021-05-08 00:16:27 +00:00
2021-02-03 00:16:23 +00:00
2021-08-24 00:17:00 +00:00
2021-06-15 00:16:37 +00:00
2021-01-04 10:26:59 +01:00
2021-07-22 00:16:46 +00:00
2021-08-14 00:16:29 +00:00
2021-08-18 00:16:48 +00:00
2021-04-07 00:16:39 +00:00
2021-05-04 00:16:53 +00:00
2021-08-31 00:16:50 +00:00
2021-08-28 00:16:42 +00:00
2021-08-24 00:17:00 +00:00
2021-08-30 00:16:44 +00:00
2021-06-18 00:16:58 +00:00
2021-01-06 00:16:55 +00:00
2021-05-26 00:16:41 +00:00
2021-08-31 00:16:50 +00:00
2021-06-09 00:16:30 +00:00
2021-08-12 00:16:28 +00:00
2021-01-06 00:16:55 +00:00
2021-01-06 00:16:55 +00:00
2021-06-26 00:16:39 +00:00
2021-05-15 00:16:27 +00:00
2021-01-06 00:16:55 +00:00
2020-01-15 14:29:53 +01:00
2021-06-24 16:51:40 +05:30
2021-08-22 00:16:40 +00:00
2021-01-05 16:04:14 -07:00

This directory contains the GNU Compiler Collection (GCC).

The GNU Compiler Collection is free software.  See the files whose
names start with COPYING for copying permission.  The manuals, and
some of the runtime libraries, are under different terms; see the
individual source files for details.

The directory INSTALL contains copies of the installation information
as HTML and plain text.  The source of this information is
gcc/doc/install.texi.  The installation information includes details
of what is included in the GCC sources and what files GCC installs.

See the file gcc/doc/gcc.texi (together with other files that it
includes) for usage and porting information.  An online readable
version of the manual is in the files gcc/doc/gcc.info*.

See http://gcc.gnu.org/bugs/ for how to report bugs usefully.

Copyright years on GCC source files may be listed using range
notation, e.g., 1987-2012, indicating that every year in the range,
inclusive, is a copyrightable year that could otherwise be listed
individually.
S
Description
Yggdrasil port of the GNU Compiler Collection
Readme 978 MiB
Languages
C++ 33%
C 27.4%
Ada 13%
Go 7.1%
D 7%
Other 12.1%