]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Fix handling of extern templates in modules [PR112820]
authorNathaniel Shead <nathanieloshead@gmail.com>
Wed, 17 Jan 2024 05:50:39 +0000 (16:50 +1100)
committerNathaniel Shead <nathanieloshead@gmail.com>
Tue, 23 Jan 2024 09:46:01 +0000 (20:46 +1100)
commitaffef534b0335592336c82918f15242576e2ab8f
tree96a6599431751bf7e7dbbd2dc7918ede8193f541
parent5015015ae6b29b3f1734c7693ba25b88cdd531a1
c++: Fix handling of extern templates in modules [PR112820]

Currently, extern templates are detected by looking for the
DECL_EXTERNAL flag on a TYPE_DECL. However, this is incorrect:
TYPE_DECLs don't actually set this flag, and it happens to work by
coincidence due to TYPE_DECL_SUPPRESS_DEBUG happening to use the same
underlying bit. This however causes issues with other TYPE_DECLs that
also happen to have suppressed debug information.

Instead, this patch reworks the logic so CLASSTYPE_INTERFACE_ONLY is
always emitted into the module BMI and can then be used to check for an
extern template correctly.

Otherwise, for other declarations we always want to redetermine this:
even for declarations from the GMF, we may change our mind on whether to
import or export depending on decisions made later in the TU after
importing so we shouldn't decide this now, or necessarily reuse what the
module we'd imported had decided.

Some of this may need to change in the future to account for
https://github.com/itanium-cxx-abi/cxx-abi/issues/170.

PR c++/112820
PR c++/102607

gcc/cp/ChangeLog:

* module.cc (trees_out::lang_type_bools): Write interface_only
and interface_unknown.
(trees_in::lang_type_bools): Read the above flags.
(trees_in::decl_value): Reset CLASSTYPE_INTERFACE_* except for
extern templates.
(trees_in::read_class_def): Remove buggy extern template
handling.

gcc/testsuite/ChangeLog:

* g++.dg/modules/debug-2_a.C: New test.
* g++.dg/modules/debug-2_b.C: New test.
* g++.dg/modules/debug-2_c.C: New test.
* g++.dg/modules/debug-3_a.C: New test.
* g++.dg/modules/debug-3_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
gcc/cp/module.cc
gcc/testsuite/g++.dg/modules/debug-2_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/debug-2_b.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/debug-2_c.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/debug-3_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/debug-3_b.C [new file with mode: 0644]