https://gcc.gnu.org/g:c1a53d9dcf9ebf0a6b4528a8c3eae48a583f272c

commit r15-3033-gc1a53d9dcf9ebf0a6b4528a8c3eae48a583f272c
Author: Nathaniel Shead <nathanielosh...@gmail.com>
Date:   Sat Aug 17 22:37:30 2024 +1000

    c++/modules: Disable streaming definitions of non-vague-linkage GMF decls 
[PR115020]
    
    The error in the linked PR is caused because 'DECL_THIS_STATIC' is true
    for the static member function, causing the streaming code to assume
    that this is an internal linkage GM entity that needs to be explicitly
    streamed, which then on read-in gets marked as a vague linkage function
    (despite being non-inline) causing import_export_decl to complain.
    
    However, I don't see any reason why we should care about this:
    definitions in the GMF should just be emitted as per usual regardless of
    whether they're internal-linkage or not.  Actually the only thing we
    care about here are header modules, since they have no TU to write
    definitions into.  As such this patch removes these conditions from
    'has_definition' and updates some comments to clarify.
    
            PR c++/115020
    
    gcc/cp/ChangeLog:
    
            * module.cc (has_definition): Only force writing definitions for
            header_module_p.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/modules/pr115020_a.C: New test.
            * g++.dg/modules/pr115020_b.C: New test.
    
    Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
    Reviewed-by: Jason Merrill <ja...@redhat.com>

Diff:
---
 gcc/cp/module.cc                          | 14 +++++++-------
 gcc/testsuite/g++.dg/modules/pr115020_a.C | 10 ++++++++++
 gcc/testsuite/g++.dg/modules/pr115020_b.C | 10 ++++++++++
 3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index ce0ba69641b..7c42aea05ee 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -11790,10 +11790,9 @@ has_definition (tree decl)
       if (DECL_DECLARED_INLINE_P (decl))
        return true;
 
-      if (DECL_THIS_STATIC (decl)
-         && (header_module_p ()
-             || (!DECL_LANG_SPECIFIC (decl) || !DECL_MODULE_PURVIEW_P (decl))))
-       /* GM static function.  */
+      if (header_module_p ())
+       /* We always need to write definitions in header modules,
+          since there's no TU to emit them in otherwise.  */
        return true;
 
       if (DECL_TEMPLATE_INFO (decl))
@@ -11826,11 +11825,12 @@ has_definition (tree decl)
       else
        {
          if (!DECL_INITIALIZED_P (decl))
+           /* Not defined.  */
            return false;
 
-         if (header_module_p ()
-             || (!DECL_LANG_SPECIFIC (decl) || !DECL_MODULE_PURVIEW_P (decl)))
-           /* GM static variable.  */
+         if (header_module_p ())
+           /* We always need to write definitions in header modules,
+              since there's no TU to emit them in otherwise.  */
            return true;
 
          if (!TREE_CONSTANT (decl))
diff --git a/gcc/testsuite/g++.dg/modules/pr115020_a.C 
b/gcc/testsuite/g++.dg/modules/pr115020_a.C
new file mode 100644
index 00000000000..8c190f13b1e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr115020_a.C
@@ -0,0 +1,10 @@
+// PR c++/115020
+// { dg-additional-options "-fmodules-ts -Wno-global-module" }
+// { dg-module-cmi M:a }
+
+module;
+struct Check { static void assertion(); };
+void Check::assertion() {}
+
+module M:a;
+Check c;
diff --git a/gcc/testsuite/g++.dg/modules/pr115020_b.C 
b/gcc/testsuite/g++.dg/modules/pr115020_b.C
new file mode 100644
index 00000000000..e299454ed54
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr115020_b.C
@@ -0,0 +1,10 @@
+// PR c++/115020
+// { dg-additional-options "-fmodules-ts -Wno-global-module" }
+// { dg-module-cmi M }
+
+module;
+struct Check { static void assertion(); };
+
+export module M;
+import :a;
+void foo() { Check::assertion(); }

Reply via email to