mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 10:40:40 +08:00
This patch fixes some issues with substitution into a C++20 template parameter object wrapper: * The first testcase demonstrates a situation where the same_type_p assert in relevant case of tsubst_copy doesn't hold, because (partial) substitution of {int,} into the wrapper's TREE_TYPE yields A<int> but substitution into the underlying TEMPLATE_PARM_INDEX is a nop due to tsubst's level==1/tf_partial early exit tests, hence TREE_TYPE in the latter case remains A<T>. So this patch just gets rid of the assert; the type mismatch doesn't seem to be a problem in practice. * In the second testcase, dependent substitution into the underlying TEMPLATE_PARM_INDEX yields a CALL_EXPR with empty TREE_TYPE, which tsubst_copy doesn't expect. This patch fixes this by handling empty TREE_TYPE the same way as a non-const TREE_TYPE. Moreover, after this substitution we're left with a VIEW_CONVERT_EXPR wrapping a CALL_EXPR instead of a TEMPLATE_PARM_INDEX, which during the subsequent non-dependent substitution tsubst_copy doesn't expect either. So this patch also relaxes tsubst_copy to accept such VIEW_CONVERT_EXPR too. * In the third testcase, we end up never resolving the call to f.modify() because tsubst_copy doesn't do overload resolution. This patch fixes this by moving the handling of these VIEW_CONVERT_EXPR wrappers from tsubst_copy to tsubst_copy_and_build. For good measure tsubst_copy_and_build should also handle REF_PARENTHESIZED_P wrappers instead of delegating to tsubst_copy. PR c++/103346 PR c++/104278 PR c++/102553 gcc/cp/ChangeLog: * pt.cc (tsubst_copy) <case VIEW_CONVERT_EXPR>: Move the handling of C++20 template parameter object wrappers to ... (tsubst_copy_and_build) <case VIEW_CONVERT_EXPR>: ... here. Accept non-TEMPLATE_PARM_INDEX inner operand. Handle empty TREE_TYPE on substituted inner operand. Remove same_type_p assert. Also handle REF_PARENTHESIZED_P VIEW_CONVERT_EXPRs. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/nontype-class52a.C: New test. * g++.dg/cpp2a/nontype-class53.C: New test. * g++.dg/cpp2a/nontype-class54.C: New test. * g++.dg/cpp2a/nontype-class55.C: New test.
…
…
…
…
…
…
…
…
…
…
…
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
Languages
C++
31.9%
C
31.3%
Ada
12%
D
6.5%
Go
6.4%
Other
11.5%