]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++/modules: Fix treatment of unnamed types
authorNathaniel Shead <nathanieloshead@gmail.com>
Thu, 23 May 2024 12:50:58 +0000 (22:50 +1000)
committerNathaniel Shead <nathanieloshead@gmail.com>
Fri, 24 May 2024 14:10:41 +0000 (00:10 +1000)
commit0173dcce92baa62a74929814a75edb75eeab1a54
tree7c6d7211ac5767d2b89548f54f958a7455c35d17
parent401994d60ab38ffa9e63f368f0456eb7b08599be
c++/modules: Fix treatment of unnamed types

In r14-9530 we relaxed "depending on type with no-linkage" errors for
declarations that could actually be accessed from different TUs anyway.
However, this also enabled it for unnamed types, which never work.

In a normal module interface, an unnamed type is TU-local by
[basic.link] p15.2, and so cannot be exposed or the program is
ill-formed.  We don't yet implement this checking but we should assume
that we will later; currently supporting this actually causes ICEs when
attempting to create the mangled name in some situations.

For a header unit, by [module.import] p5.3 it is unspecified whether two
TUs importing a header unit providing such a declaration are importing
the same header unit.  In this case, we would require name mangling
changes to somehow allow the (anonymous) type exported by such a header
unit to correspond across different TUs in the presence of other
anonymous declarations, so for this patch just assume that this case
would be an ODR violation instead.

gcc/cp/ChangeLog:

* tree.cc (no_linkage_check): Anonymous types can't be accessed
in a different TU.

gcc/testsuite/ChangeLog:

* g++.dg/modules/linkage-1_a.C: Remove anonymous type test.
* g++.dg/modules/linkage-1_b.C: Likewise.
* g++.dg/modules/linkage-1_c.C: Likewise.
* g++.dg/modules/linkage-2.C: Add note about anonymous types.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/tree.cc
gcc/testsuite/g++.dg/modules/linkage-1_a.C
gcc/testsuite/g++.dg/modules/linkage-1_b.C
gcc/testsuite/g++.dg/modules/linkage-1_c.C
gcc/testsuite/g++.dg/modules/linkage-2.C