From: Nathaniel Shead Date: Tue, 2 Jan 2024 22:27:06 +0000 (+1100) Subject: c++: Emit definitions of ODR-used static members imported from modules [PR112899] X-Git-Tag: basepoints/gcc-15~1688 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a0dde47f84f17cbe7fa2fb41c14c5a2db8c4d63a;p=thirdparty%2Fgcc.git c++: Emit definitions of ODR-used static members imported from modules [PR112899] Static data members marked 'inline' should be emitted in TUs where they are ODR-used. We need to make sure that inlines imported from modules are correctly added to the 'pending_statics' map so that they get emitted if needed, otherwise the attached testcase fails to link. PR c++/112899 gcc/cp/ChangeLog: * cp-tree.h (note_variable_template_instantiation): Rename to... (note_vague_linkage_variable): ...this. * decl2.cc (note_variable_template_instantiation): Rename to... (note_vague_linkage_variable): ...this. * pt.cc (instantiate_decl): Rename usage of above function. * module.cc (trees_in::read_var_def): Remember pending statics that we stream in. gcc/testsuite/ChangeLog: * g++.dg/modules/init-4_a.C: New test. * g++.dg/modules/init-4_b.C: New test. * g++.dg/modules/init-6_a.H: New test. * g++.dg/modules/init-6_b.C: New test. Signed-off-by: Nathaniel Shead Reviewed-by: Patrick Palka Reviewed-by: Jason Merrill +struct __from_chars_alnum_to_val_table { + static inline int value = 42; +}; + +inline unsigned char +__from_chars_alnum_to_val() { + return __from_chars_alnum_to_val_table::value; +} + +template +static inline int nonclass_value = 42; + +inline unsigned char +get_nonclass_val() { + return nonclass_value; +} diff --git a/gcc/testsuite/g++.dg/modules/init-6_b.C b/gcc/testsuite/g++.dg/modules/init-6_b.C new file mode 100644 index 000000000000..d704968ec375 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/init-6_b.C @@ -0,0 +1,9 @@ +// { dg-module-do link } +// { dg-additional-options "-fmodules-ts" } + +import "init-6_a.H"; + +int main() { + __from_chars_alnum_to_val(); + get_nonclass_val(); +}