https://gcc.gnu.org/g:57feb6afcade6b066477359bee41d071225ab499

commit r15-9594-g57feb6afcade6b066477359bee41d071225ab499
Author: Nathaniel Shead <nathanielosh...@gmail.com>
Date:   Sat Apr 26 00:10:34 2025 +1000

    c++/modules: Ensure DECL_FRIEND_CONTEXT is streamed [PR119939]
    
    An instantiated friend function relies on DECL_FRIEND_CONTEXT being set
    to be able to recover the template arguments of the class that
    instantiated it, despite not being a template itself.  This patch
    ensures that this data is streamed even when DECL_CLASS_SCOPE_P is not
    true.
    
            PR c++/119939
    
    gcc/cp/ChangeLog:
    
            * module.cc (trees_out::lang_decl_vals): Also stream
            lang->u.fn.context when DECL_UNIQUE_FRIEND_P.
            (trees_in::lang_decl_vals): Likewise.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/modules/concept-11_a.H: New test.
            * g++.dg/modules/concept-11_b.C: New test.
    
    Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
    (cherry picked from commit 1c5cf7cc82d3a2afa5d4fb90049456be408c2a7a)

Diff:
---
 gcc/cp/module.cc                            | 4 ++--
 gcc/testsuite/g++.dg/modules/concept-11_a.H | 9 +++++++++
 gcc/testsuite/g++.dg/modules/concept-11_b.C | 9 +++++++++
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 5ff5c462e79c..a2e0d6d25718 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -7386,7 +7386,7 @@ trees_out::lang_decl_vals (tree t)
            WU (lang->u.fn.ovl_op_code);
        }
 
-      if (DECL_CLASS_SCOPE_P (t))
+      if (DECL_CLASS_SCOPE_P (t) || DECL_UNIQUE_FRIEND_P (t))
        WT (lang->u.fn.context);
 
       if (lang->u.fn.thunk_p)
@@ -7470,7 +7470,7 @@ trees_in::lang_decl_vals (tree t)
            lang->u.fn.ovl_op_code = code;
        }
 
-      if (DECL_CLASS_SCOPE_P (t))
+      if (DECL_CLASS_SCOPE_P (t) || DECL_UNIQUE_FRIEND_P (t))
        RT (lang->u.fn.context);
 
       if (lang->u.fn.thunk_p)
diff --git a/gcc/testsuite/g++.dg/modules/concept-11_a.H 
b/gcc/testsuite/g++.dg/modules/concept-11_a.H
new file mode 100644
index 000000000000..451276828123
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-11_a.H
@@ -0,0 +1,9 @@
+// PR c++/119939
+// { dg-additional-options "-fmodule-header -std=c++20" }
+// { dg-module-cmi {} }
+
+template <typename T> concept A = true;
+template <typename T> concept B = requires { T{}; };
+template <typename T> struct S {
+  friend bool operator==(const S&, const S&) requires B<T> = default;
+};
diff --git a/gcc/testsuite/g++.dg/modules/concept-11_b.C 
b/gcc/testsuite/g++.dg/modules/concept-11_b.C
new file mode 100644
index 000000000000..3f6676ff9652
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-11_b.C
@@ -0,0 +1,9 @@
+// PR c++/119939
+// { dg-additional-options "-fmodules -std=c++20" }
+
+import "concept-11_a.H";
+
+int main() {
+  S<int> s;
+  s == s;
+}

Reply via email to