Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
OK for trunk/16?

-- >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>();
-- 
2.55.0.787.g3cb9185f65

Reply via email to