Tested on x86_64-pc-linux-gnu, does this look OK for trunk/16?
-- >8 --
Here transfer_defining_module (added in r16-5213), assumes that if
a redeclaration has DECL_LANG_SPECIFIC allocated, then so must the
original declaration, but this isn't true for q below. Instead we
should call retrofit_lang_decl to allocate DECL_LANG_SPECIFIC on
demand, as done in other parts of duplicate_decls.
PR c++/126783
gcc/cp/ChangeLog:
* module.cc (transfer_defining_module): Call retrofit_lang_decl
instead of assuming the old declaration already has
DECL_LANG_SPECIFIC allocated.
gcc/testsuite/ChangeLog:
* g++.dg/modules/gmf-6.C: New test.
---
gcc/cp/module.cc | 2 +-
gcc/testsuite/g++.dg/modules/gmf-6.C | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/modules/gmf-6.C
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index d6bd4c78d804..09c6c4467347 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -22415,7 +22415,7 @@ transfer_defining_module (tree olddecl, tree newdecl)
if (DECL_LANG_SPECIFIC (new_inner))
{
- gcc_checking_assert (DECL_LANG_SPECIFIC (old_inner));
+ retrofit_lang_decl (old_inner);
if (DECL_MODULE_PURVIEW_P (new_inner))
DECL_MODULE_PURVIEW_P (old_inner) = true;
if (!DECL_MODULE_IMPORT_P (new_inner))
diff --git a/gcc/testsuite/g++.dg/modules/gmf-6.C
b/gcc/testsuite/g++.dg/modules/gmf-6.C
new file mode 100644
index 000000000000..201650917a32
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/gmf-6.C
@@ -0,0 +1,7 @@
+// PR c++/126783
+// { dg-additional-options "-fmodules -Wno-global-module" }
+// { dg-module-cmi M }
+module;
+extern int const q;
+inline constexpr int q = 1;
+export module M;
--
2.55.0.559.g11c6700f10