From: Nathaniel Shead Date: Tue, 14 Nov 2023 16:26:03 +0000 (-0500) Subject: c++: Stream virtual dtor vtable indices X-Git-Tag: basepoints/gcc-15~4678 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=14979dd31c887ba5ba573f2cdb0647b37e09641a;p=thirdparty%2Fgcc.git 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 Signed-off-by: Nathan Sidwell --- diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index c1c8c226bc1e..4f5b6e2747a7 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 000000000000..0497c2c55044 --- /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 000000000000..b7468562ba9b --- /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; +}