aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.cc
diff options
context:
space:
mode:
authorNathaniel Shead <nathanieloshead@gmail.com>2024-06-27 11:08:15 +1000
committerNathaniel Shead <nathanieloshead@gmail.com>2024-07-12 22:47:30 +1000
commitd6bf4b1c93221118b3008a878ec508f6412dfc55 (patch)
tree35e3c8792daa0fa077d4eabebc74b1eaa38a51df /gcc/cp/parser.cc
parent61715e9340ab8941d40d62158fe437e9dbe3e068 (diff)
downloadgcc-d6bf4b1c93221118b3008a878ec508f6412dfc55.zip
gcc-d6bf4b1c93221118b3008a878ec508f6412dfc55.tar.gz
gcc-d6bf4b1c93221118b3008a878ec508f6412dfc55.tar.bz2
c++: Introduce USING_DECLs for non-function usings [PR114683]
With modules, a non-function using-declaration is not completely interchangable with the declaration that it refers to; in particular, such a using-declaration may be exported without revealing the name of the entity it refers to. This patch fixes this by building USING_DECLs for all using-declarations that bind a non-function from a different scope. These new decls can than have purviewness and exportingness attached to them without affecting the decl that they refer to. We do this for all such usings, not just usings that may be revealed in a module; this way we can verify the change in representation against the (more comprehensive) non-modules testsuites, and in a future patch we can use the locations of these using-decls to enhance relevant diagnostics. Another possible approach would be to reuse OVERLOADs for this, as is already done within add_binding_entity for modules. I didn't do this because lots of code (as well as the names of the accessors) makes assumptions that OVERLOADs refer to function overload sets, and so splitting this up reduced semantic burden and made it easier to avoid unintentional changes. This did mean that we need to move out the definitions of ovl_iterator::{purview,exporting}_p, because the structures for module decls are declared later on in cp-tree.h. Building USING_DECLs changed a couple of code paths when adjusting bindings; in particular, pushdecl recognises global using-declarations as usings now, and so checks fall through to update_binding. To not regress g++.dg/lookup/linkage2.C the checks for 'extern' declarations no longer were sufficient (they don't handle 'extern "C"'); but duplicate_decls performed all the relevant checks anyway. Otherwise in general we strip using-decls from all lookup_* functions where necessary. Over time for diagnostics purposes it would probably be good to slowly revert this (especially e.g. lookup_elaborated_type causes some diagnostic quality regressions here) but this patch doesn't do so to minimise churn. This patch also tries not to build USING_DECLs when just redeclaring an existing declaration, and instead reveals that declaration in-place. This requires reworking some logic handling CONST_DECLs in module streaming, since a non-using CONST_DECL may now be exported indepenently of its containing enum. 'add_binding_entity' needs to explicitly write the names of unscoped enumerators so that lazy loading will trigger when the name is found by name lookup; it does this by pretending that the enum declarations are always usings so that it doesn't double-write definitions. By also checking if the enumerator was marked purview/exported we can use that to override a non-purview/non-exported TYPE_DECL and ensure it's made visible regardless. When reading we should get the exported flag on the enumeration constant, and so should properly create a binding for it. We don't need to do anything to handle importedness as that checking is skipped for EK_USINGs. Some other places assume that module information for a CONST_DECL inherits module information from its containing type. This includes: - get_originating_module_decl, for determining if the name was imported or has module attachment; I don't /think/ this change should affect that, so I'm leaving this untouched. - binding_cmp, for sorting by exportedness; since now an enumerator could be exported without the containing decl being exported, we need to handle this here too. PR c++/114683 gcc/cp/ChangeLog: * cp-tree.h (class ovl_iterator): Move definitions of purview_p and exporting_p to name-lookup.cc. * module.cc (depset::hash::add_binding_entity): Strip using-decls. Remove workarounds. Handle CONST_DECLs with different purview/exported from their enum. (enum ct_bind_flags): Remove unnecessary cbf_wrapped flag. (module_state::write_cluster): Likewise. (module_state::read_cluster): Build USING_DECL for non-function usings. (binding_cmp): Handle CONST_DECLs with different purview and/or exported from their enum. (set_instantiating_module): Support CONST_DECLs. * name-lookup.cc (get_fixed_binding_slot): Strip USING_DECLs. (name_lookup::process_binding): Strip USING_DECLs. (name_lookup::process_module_binding): Remove workaround. (update_binding): Strip USING_DECLs, remove incorrect check for non-extern variables. (ovl_iterator::purview_p): Support USING_DECLs. (ovl_iterator::exporting_p): Support USING_DECLs. (walk_module_binding): Handle stat hack type. (do_nonmember_using_decl): Strip USING_DECLs when comparing; build USING_DECLs for non-function usings in different scope rather than binding directly. (get_namespace_binding): Strip USING_DECLs. (lookup_name): Strip USING_DECLs. (lookup_elaborated_type): Strip USING_DECLs. * decl.cc (poplevel): Still support -Wunused for using-decls. (lookup_and_check_tag): Remove unnecessary strip_using_decl. * parser.cc (cp_parser_template_name): Likewise. (cp_parser_nonclass_name): Likewise. (cp_parser_class_name): Likewise. gcc/testsuite/ChangeLog: * g++.dg/lookup/using29.C: Update errors. * g++.dg/lookup/using53.C: Update errors, add XFAILs. * g++.dg/modules/using-22_b.C: Remove xfails. * g++.dg/warn/Wunused-var-18.C: Update error, add check. * g++.dg/lookup/using68.C: New test. * g++.dg/modules/using-24_a.C: New test. * g++.dg/modules/using-24_b.C: New test. * g++.dg/modules/using-25_a.C: New test. * g++.dg/modules/using-25_b.C: New test. * g++.dg/modules/using-enum-4_a.C: New test. * g++.dg/modules/using-enum-4_b.C: New test. * g++.dg/modules/using-enum-4_c.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc/cp/parser.cc')
-rw-r--r--gcc/cp/parser.cc6
1 files changed, 0 insertions, 6 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 6bf3f52..1dd0efa 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -19442,8 +19442,6 @@ cp_parser_template_name (cp_parser* parser,
/*ambiguous_decls=*/NULL,
token->location);
- decl = strip_using_decl (decl);
-
/* 13.3 [temp.names] A < is interpreted as the delimiter of a
template-argument-list if it follows a name that is not a
conversion-function-id and
@@ -21061,8 +21059,6 @@ cp_parser_nonclass_name (cp_parser* parser)
/* Look up the type-name. */
type_decl = cp_parser_lookup_name_simple (parser, identifier, token->location);
- type_decl = strip_using_decl (type_decl);
-
if (TREE_CODE (type_decl) != TYPE_DECL
&& (objc_is_id (identifier) || objc_is_class_name (identifier)))
{
@@ -26834,8 +26830,6 @@ cp_parser_class_name (cp_parser *parser,
decl = TYPE_NAME (decl);
}
- decl = strip_using_decl (decl);
-
/* Check to see that it is really the name of a class. */
if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
&& identifier_p (TREE_OPERAND (decl, 0))