diff options
author | Nathaniel Shead <nathanieloshead@gmail.com> | 2023-11-14 11:26:03 -0500 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2023-11-14 14:43:20 -0500 |
commit | 14979dd31c887ba5ba573f2cdb0647b37e09641a (patch) | |
tree | a81f5bf5a6adb8b356d5d81efa8cfad3ffc39701 | |
parent | 5b9ecce87e8f315e2681743d75401991cdfefa71 (diff) | |
download | gcc-14979dd31c887ba5ba573f2cdb0647b37e09641a.zip gcc-14979dd31c887ba5ba573f2cdb0647b37e09641a.tar.gz gcc-14979dd31c887ba5ba573f2cdb0647b37e09641a.tar.bz2 |
c++: Stream virtual dtor vtable indices
Virtual cloned functions have distinct vtable indices, stream them
explicitly.
As such, this patch ensures that DECL_VINDEX is properly passed on for
cloned functions as well to prevent this from causing issues.
PR c++/103499
gcc/cp/ChangeLog:
* module.cc (trees_out::decl_node): Write DECL_VINDEX for
virtual clones.
(trees_in::tree_node): Read DECL_VINDEX for virtual clones.
gcc/testsuite/ChangeLog:
* g++.dg/modules/pr103499_a.C: New test.
* g++.dg/modules/pr103499_b.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Signed-off-by: Nathan Sidwell <nathan@acm.org>
-rw-r--r-- | gcc/cp/module.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/modules/pr103499_a.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/modules/pr103499_b.C | 8 |
3 files changed, 26 insertions, 0 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index c1c8c22..4f5b6e2 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -8648,6 +8648,8 @@ trees_out::decl_node (tree decl, walk_kind ref) tree_node (target); tree_node (DECL_NAME (decl)); + if (DECL_VIRTUAL_P (decl)) + tree_node (DECL_VINDEX (decl)); int tag = insert (decl); if (streaming_p ()) dump (dumper::TREE) @@ -9869,6 +9871,10 @@ trees_in::tree_node (bool is_use) } } + /* A clone might have a different vtable entry. */ + if (res && DECL_VIRTUAL_P (res)) + DECL_VINDEX (res) = tree_node (); + if (!res) set_overrun (); int tag = insert (res); diff --git a/gcc/testsuite/g++.dg/modules/pr103499_a.C b/gcc/testsuite/g++.dg/modules/pr103499_a.C new file mode 100644 index 0000000..0497c2c --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr103499_a.C @@ -0,0 +1,12 @@ +// PR c++/103499 +// { dg-module-do compile } +// { dg-additional-options "-fmodules-ts" } +// { dg-module-cmi pr103499 } + +export module pr103499; + +export struct base { + virtual ~base() = default; +}; + +export struct derived : base {}; diff --git a/gcc/testsuite/g++.dg/modules/pr103499_b.C b/gcc/testsuite/g++.dg/modules/pr103499_b.C new file mode 100644 index 0000000..b746856 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr103499_b.C @@ -0,0 +1,8 @@ +// PR c++/103499 +// { dg-additional-options "-fmodules-ts" } + +import pr103499; + +void test(derived* p) { + delete p; +} |