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

Reply via email to