]> gcc.gnu.org Git - gcc.git/commit
c++: Improve access checking inside templates [PR41437]
authorPatrick Palka <ppalka@redhat.com>
Tue, 16 Jun 2020 12:21:33 +0000 (08:21 -0400)
committerPatrick Palka <ppalka@redhat.com>
Tue, 16 Jun 2020 12:21:33 +0000 (08:21 -0400)
commit92bed036098928cd4659c8990e14cf7ad040e0c2
treea41d5a47ed52906aaae2ff413a440c41791e5b94
parenta97e49a89d11b302b12ec319a3316ba78adca02a
c++: Improve access checking inside templates [PR41437]

This patch generalizes our existing functionality for deferring access
checking of typedefs when parsing a function or class template to now
defer all kinds of access checks until template instantiation time,
including member function and member object accesses.

Since all access checks eventually go through enforce_access, the main
component of this patch is new handling inside enforce_access to defer
the current access check if we're inside a template.  The bulk of the
rest of the patch consists of removing now-unneeded code pertaining to
suppressing access checks inside templates or pertaining to
typedef-specific access handling.  Renamings and other changes with no
functional impact have been split off into the followup patch.

gcc/cp/ChangeLog:

PR c++/41437
PR c++/47346
* call.c (enforce_access): Move to semantics.c.
* cp-tree.h (enforce_access): Delete.
(get_types_needing_access_check): Delete.
(add_typedef_to_current_template_for_access_check): Delete.
* decl.c (make_typename_type): Adjust accordingly.  Use
check_accessibility_of_qualified_id instead of directly using
perform_or_defer_access_check.
* parser.c (cp_parser_template_declaration_after_parameters):
Don't push a dk_no_check access state when parsing a template.
* pt.c (get_types_needing_access_check): Delete.
(append_type_to_template_for_access_check_1): Delete.
(perform_typedefs_access_check): Adjust.  If type_decl is a
FIELD_DECL, also check its DECL_CONTEXT for dependence. Use
tsubst_copy instead of tsubst to substitute into type_decl so
that we substitute into the DECL_CONTEXT of a FIELD_DECL.
(append_type_to_template_for_access_check): Delete.
* search.c (accessible_p): Remove the processing_template_decl
early exit.
* semantics.c (enforce_access): Moved from call.c.  If we're
parsing a template and the access check failed, add the check to
TI_TYPEDEFS_NEEDING_ACCESS_CHECKING.
(perform_or_defer_access_check): Adjust comment.
(add_typedef_to_current_template_for_access_check): Delete.
(check_accessibility_of_qualified_id):  Adjust accordingly.
Exit early if the scope is dependent.

gcc/testsuite/ChangeLog:

PR c++/41437
PR c++/47346
* g++.dg/cpp2a/concepts-using2.C: Adjust.
* g++.dg/lto/20081219_1.C: Adjust.
* g++.dg/lto/20091002-1_0.C: Adjust.
* g++.dg/lto/pr65475c_0.C: Adjust.
* g++.dg/opt/dump1.C: Adjust.
* g++.dg/other/pr53574.C: Adjust.
* g++.dg/template/access30.C: New test.
* g++.dg/template/access31.C: New test.
* g++.dg/wrappers/wrapper-around-type-pack-expansion.C: Adjust.

libstdc++-v3/ChangeLog:

PR libstdc++/94003
* testsuite/20_util/is_constructible/94003.cc: New test.
17 files changed:
gcc/cp/call.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/search.c
gcc/cp/semantics.c
gcc/testsuite/g++.dg/cpp2a/concepts-using2.C
gcc/testsuite/g++.dg/lto/20081219_1.C
gcc/testsuite/g++.dg/lto/20091002-1_0.C
gcc/testsuite/g++.dg/lto/pr65475c_0.C
gcc/testsuite/g++.dg/opt/dump1.C
gcc/testsuite/g++.dg/other/pr53574.C
gcc/testsuite/g++.dg/template/access30.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/access31.C [new file with mode: 0644]
gcc/testsuite/g++.dg/wrappers/wrapper-around-type-pack-expansion.C
libstdc++-v3/testsuite/20_util/is_constructible/94003.cc [new file with mode: 0644]
This page took 0.073552 seconds and 6 git commands to generate.