Find a file
Nathaniel Shead d6bf4b1c93 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:#️⃣: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>
2024-07-12 22:47:30 +10:00
.github Minor formatting fix for newly-added file from previous commit 2023-11-01 19:28:56 -04:00
c++tools Daily bump. 2024-05-09 10:58:01 +00:00
config Daily bump. 2024-04-17 00:18:45 +00:00
contrib Daily bump. 2024-06-06 00:16:43 +00:00
fixincludes Daily bump. 2024-07-12 00:17:52 +00:00
gcc c++: Introduce USING_DECLs for non-function usings [PR114683] 2024-07-12 22:47:30 +10:00
gnattools Daily bump. 2024-07-08 00:17:01 +00:00
gotools Daily bump. 2024-04-16 00:18:06 +00:00
include Daily bump. 2024-07-03 00:19:01 +00:00
INSTALL
libada Update copyright years. 2024-01-03 12:19:35 +01:00
libatomic Daily bump. 2024-06-26 00:17:38 +00:00
libbacktrace libbacktrace: avoid infinite recursion 2024-07-11 19:34:45 -07:00
libcc1 Daily bump. 2024-03-17 00:17:21 +00:00
libcody Update Copyright year in ChangeLog files 2024-01-03 11:35:18 +01:00
libcpp Daily bump. 2024-06-22 00:18:44 +00:00
libdecnumber Daily bump. 2024-04-03 00:17:29 +00:00
libffi Daily bump. 2024-07-02 00:17:36 +00:00
libgcc Daily bump. 2024-06-15 00:16:29 +00:00
libgfortran Daily bump. 2024-07-12 00:17:52 +00:00
libgm2 Daily bump. 2024-05-30 00:16:44 +00:00
libgo runtime: dump registers on Solaris 2024-04-29 11:39:58 -07:00
libgomp Daily bump. 2024-07-02 00:17:36 +00:00
libgrust Update copyright years. 2024-02-21 13:51:26 +01:00
libiberty Daily bump. 2024-04-03 00:17:29 +00:00
libitm Daily bump. 2024-06-01 00:17:20 +00:00
libobjc Daily bump. 2024-04-03 00:17:29 +00:00
libphobos Daily bump. 2024-06-01 00:17:20 +00:00
libquadmath Daily bump. 2024-05-09 10:58:01 +00:00
libsanitizer Daily bump. 2024-02-17 00:17:08 +00:00
libssp Daily bump. 2024-05-09 10:58:01 +00:00
libstdc++-v3 [libstdc++] [testsuite] require dfprt on some tests 2024-07-12 05:42:19 -03:00
libvtv Daily bump. 2024-06-01 00:17:20 +00:00
lto-plugin Update copyright years. 2024-01-03 12:19:35 +01:00
maintainer-scripts Daily bump. 2024-07-08 00:17:01 +00:00
zlib Daily bump. 2023-10-23 00:16:43 +00:00
.dir-locals.el
.gitattributes
.gitignore *: add modern gettext 2023-11-14 00:47:11 +01:00
ABOUT-NLS
ar-lib
ChangeLog Daily bump. 2024-07-12 00:17:52 +00:00
ChangeLog.jit
ChangeLog.tree-ssa
compile
config-ml.in config-ml.in: Fix multi-os-dir search 2024-05-06 12:08:28 +08:00
config.guess
config.rpath
config.sub
configure build: Fix missing variable quotes and typo 2024-06-20 10:58:37 +08:00
configure.ac build: Fix missing variable quotes and typo 2024-06-20 10:58:37 +08:00
COPYING
COPYING.LIB
COPYING.RUNTIME
COPYING3
COPYING3.LIB
depcomp
install-sh
libtool-ldflags
libtool.m4 Build: fix error in fixinclude configure 2023-11-22 11:54:33 +01:00
ltgcc.m4
ltmain.sh
ltoptions.m4
ltsugar.m4
ltversion.m4
lt~obsolete.m4
MAINTAINERS [MAINTAINERS] Update my email address and move to DCO. 2024-07-11 20:03:20 +10:00
Makefile.def gccrs: Fix missing build dependency 2024-01-16 16:23:02 +01:00
Makefile.in rust: Do not link with libdl and libpthread unconditionally 2024-06-11 11:17:12 +02:00
Makefile.tpl rust: Do not link with libdl and libpthread unconditionally 2024-06-11 11:17:12 +02:00
missing
mkdep
mkinstalldirs
move-if-change
multilib.am
README
SECURITY.txt SECURITY.txt: Drop "exploitable" in reference to hardening issues 2024-01-09 10:49:01 -05:00
symlink-tree
test-driver
ylwrap

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.