diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 6958388e454..5828748a3e6 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -14855,9 +14855,10 @@ depset::hash::add_dependency (depset *dep)
      details.  */
   if (writing_merge_key)
     {
-      dep->set_flag_bit<DB_MAYBE_RECURSIVE_BIT> ();
-      if (!current->is_maybe_recursive ())
+      if (!dep->is_maybe_recursive () && !current->is_maybe_recursive ())
 	current->set_flag_bit<DB_ENTRY_BIT> ();
+      dep->set_flag_bit<DB_MAYBE_RECURSIVE_BIT> ();
+      current->set_flag_bit<DB_MAYBE_RECURSIVE_BIT> ();
     }
 
   if (dep->is_unreached ())
diff --git a/gcc/testsuite/g++.dg/modules/late-ret-5.h b/gcc/testsuite/g++.dg/modules/late-ret-5.h
new file mode 100644
index 00000000000..6f14d18e757
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/late-ret-5.h
@@ -0,0 +1,16 @@
+// PR c++/118630
+
+namespace test1 {
+  template <typename> decltype([]{}) a();
+}
+
+namespace test2 {
+  template <typename T> struct invoke_result {};
+  template <typename T> struct foo {};
+
+  template <typename T>
+  auto b(T&& arg) -> foo<invoke_result<decltype(arg)>> {
+    invoke_result<decltype(arg)> a;
+    return {};
+  }
+}
diff --git a/gcc/testsuite/g++.dg/modules/late-ret-5_a.H b/gcc/testsuite/g++.dg/modules/late-ret-5_a.H
new file mode 100644
index 00000000000..b39b1d4529f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/late-ret-5_a.H
@@ -0,0 +1,6 @@
+// PR c++/118630
+// { dg-do compile { target c++20 } }
+// { dg-additional-options "-fmodule-header" }
+// { dg-module-cmi {} }
+
+#include "late-ret-5.h"
diff --git a/gcc/testsuite/g++.dg/modules/late-ret-5_b.C b/gcc/testsuite/g++.dg/modules/late-ret-5_b.C
new file mode 100644
index 00000000000..d22d7638127
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/late-ret-5_b.C
@@ -0,0 +1,6 @@
+// PR c++/118630
+// { dg-do compile { target c++20 } }
+// { dg-additional-options "-fmodules -fno-module-lazy" }
+
+#include "late-ret-5.h"
+import "late-ret-5_a.H";
