On 9/4/26 2:03 PM, Patrick Palka wrote:
Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
OK for trunk/16?

OK.
-- >8 --

A couple of sanity checks need to be made robust to TEMPLATE_INFO that
has IDENTIFIER_NODE as its TI_TEMPLATE, which is how we express the
friend template specialization createFoo<T>() when there is no existing
declaration of createFoo.

        PR c++/127207

gcc/cp/ChangeLog:

        * module.cc (trees_out::decl_value): Relax checking assert
        to accept IDENTIFIER_NODE as TI_TEMPLATE.
        (get_originating_module_decl): Likewise.

gcc/testsuite/ChangeLog:

        * g++.dg/modules/friend-15_a.H: New test.
        * g++.dg/modules/friend-15_b.C: New test.
---
  gcc/cp/module.cc                           |  3 ++-
  gcc/testsuite/g++.dg/modules/friend-15_a.H | 16 ++++++++++++++++
  gcc/testsuite/g++.dg/modules/friend-15_b.C |  6 ++++++
  3 files changed, 24 insertions(+), 1 deletion(-)
  create mode 100644 gcc/testsuite/g++.dg/modules/friend-15_a.H
  create mode 100644 gcc/testsuite/g++.dg/modules/friend-15_b.C

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 03a67ed25365..df7c8773a7be 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -8386,6 +8386,7 @@ trees_out::decl_value (tree decl, depset *dep)
        int use_tpl = -1;
        if (tree ti = node_template_info (decl, use_tpl))
        gcc_checking_assert (TREE_CODE (TI_TEMPLATE (ti)) == OVERLOAD
+                            || TREE_CODE (TI_TEMPLATE (ti)) == IDENTIFIER_NODE
                             || TREE_CODE (TI_TEMPLATE (ti)) == FIELD_DECL
                             || (DECL_TEMPLATE_RESULT (TI_TEMPLATE (ti))
                                 != decl));
@@ -21926,7 +21927,7 @@ get_originating_module_decl (tree decl)
          if (TREE_CODE (decl) != TEMPLATE_DECL)
            {
              /* A friend template specialization.  */
-             gcc_checking_assert (OVL_P (decl));
+             gcc_checking_assert (OVL_P (decl) || identifier_p (decl));
              return global_namespace;
            }
        }
diff --git a/gcc/testsuite/g++.dg/modules/friend-15_a.H 
b/gcc/testsuite/g++.dg/modules/friend-15_a.H
new file mode 100644
index 000000000000..f253beae9a77
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/friend-15_a.H
@@ -0,0 +1,16 @@
+// PR c++/127207
+// { dg-additional-options "-fmodule-header" }
+
+template <typename T>
+class Foo
+{
+    friend auto createFoo<T>() -> Foo;
+
+    Foo(){}
+};
+
+template <typename T>
+auto createFoo() -> Foo<T>
+{
+    return Foo<T>{};
+}
diff --git a/gcc/testsuite/g++.dg/modules/friend-15_b.C 
b/gcc/testsuite/g++.dg/modules/friend-15_b.C
new file mode 100644
index 000000000000..0ba77225d713
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/friend-15_b.C
@@ -0,0 +1,6 @@
+// PR c++/127207
+// { dg-additional-options "-fmodules" }
+
+import "friend-15_a.H";
+
+Foo<int> x = createFoo<int>();

Reply via email to