Patrick Palka a3a4f6be0c c++: Recursive unification with packs and explicit targs [PR94628]
This PR seems to be similar to PR c++/43382, except that the recursive call to
the variadic function with trailing return type in this testcase is additionally
given some explicit template arguments.

In the first testcase below, when resolving the recursive call to 'select',
fn_type_unification first substitutes in the call's explicit template arguments
before doing unification, and so during this substitution the template argument
pack for Args is incomplete.

Since the pack is incomplete, the substitution of 'args...' in the trailing
return type decltype(f(args...)) is handled by the unsubstituted_packs case of
tsubst_pack_expansion.  But the handling of this case happens _before_ we reset
local_specializations, and so the substitution ends up reusing the old binding
for 'args' from local_specializations rather than building a new one.

This patch fixes this issue by setting up local_specializations sooner in
tsubst_pack_expansion, before the handling of the unsubstituted_packs case.
It also adds a new policy to local_specialization_stack so that we could use the
class here to conditionally replace local_specializations.

gcc/cp/ChangeLog:

	PR c++/94628
	* cp-tree.h (lss_policy::lss_nop): New enumerator.
	* pt.c (local_specialization_stack::local_specialization_stack): Handle
	an lss_nop policy.
	(local_specialization_stack::~local_specialization_stack): Likewise.
	(tsubst_pack_expansion): Use a local_specialization_stack instead of
	manually saving and restoring local_specializations.  Conditionally
	replace local_specializations sooner, before the handling of the
	unsubstituted_packs case.

gcc/testsuite/ChangeLog:

	PR c++/94628
	* g++.dg/cpp0x/variadic179.C: New test.
	* g++.dg/cpp0x/variadic180.C: New test.
2020-04-20 18:34:00 -04:00
2020-04-06 21:34:20 +00: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.
Description
No description provided
Readme 2.1 GiB
Languages
C++ 31.9%
C 31.3%
Ada 12%
D 6.5%
Go 6.4%
Other 11.5%