Patrick Palka 33a84d4388 c++: extend lookup_template_class shortcut [PR110122]
Here when substituting the injected class name A during regeneration of
the lambda, we find ourselves in lookup_template_class for A<V> with
V=_ZTAXtl3BarEE (i.e. the template parameter object for Foo{}).  The call
to coerce_template_parms within then undesirably tries to make a copy of
this class NTTP argument, which fails because Foo is not copyable.  But it
seems clear that this testcase shouldn't require copyability of Foo.

lookup_template_class has a shortcut for looking up the current class
scope, which would avoid the problematic coerce_template_parms call, but
the shortcut doesn't trigger because it only considers the innermost
class scope which in this case in the lambda type.  So this patch fixes
this by extending the lookup_template_class shortcut to consider outer
class scopes too (and skipping over lambda types since they are never
specialized from lookup_template_class).  We also need to avoid calling
coerce_template_parms when specializing a templated non-template nested
class for the first time (such as A::B in the testcase).  Coercion should
be unnecessary there because the innermost arguments belong to the context
and so should have already been coerced.

	PR c++/110122

gcc/cp/ChangeLog:

	* pt.cc (lookup_template_class): Extend shortcut for looking up the
	current class scope to consider outer class scopes too, and use
	current_nonlambda_class_type instead of current_class_type.  Only
	call coerce_template_parms when specializing a primary template.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/nontype-class57.C: New test.
	* g++.dg/cpp2a/nontype-class58.C: New test.

(cherry picked from commit 682d401a6ba723b2bf98779d056efc8ff2640178)
2023-07-19 15:07:18 -04:00
2023-04-27 00:21:18 +00:00
2023-04-27 00:21:18 +00:00
2023-05-10 00:22:50 +00:00
2023-05-07 00:21:31 +00:00
2023-07-19 00:21:29 +00:00
2023-06-29 00:21:39 +00:00
2023-06-29 00:21:39 +00:00
2023-07-04 00:21: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.
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%