]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++/modules: More fixes for merging DECL_MAYBE_DELETED functions
authorNathaniel Shead <nathanieloshead@gmail.com>
Thu, 10 Apr 2025 21:29:11 +0000 (07:29 +1000)
committerNathaniel Shead <nathanieloshead@gmail.com>
Sun, 13 Apr 2025 10:33:38 +0000 (20:33 +1000)
My change in r15-9216 broke the case where we imported an uninstantiated
defaulted function over the top of one we had already finished.  This
patch ensures that we don't error for mismatches in this case.

gcc/cp/ChangeLog:

* module.cc (trees_in::is_matching_decl): Don't check for
mismatches when importing a DECL_MAYBE_DELETED function over one
that's already finished.

gcc/testsuite/ChangeLog:

* g++.dg/modules/noexcept-4_a.H: New test.
* g++.dg/modules/noexcept-4_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/module.cc
gcc/testsuite/g++.dg/modules/noexcept-4_a.H [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/noexcept-4_b.C [new file with mode: 0644]

index 8efa18baff1de4997c776b200c508c27e5e0aca1..5ff5c462e79cf84e15512731dc4938c7604ec53a 100644 (file)
@@ -12164,7 +12164,8 @@ trees_in::is_matching_decl (tree existing, tree decl, bool is_typedef)
                }
            }
        }
-      else if (!DEFERRED_NOEXCEPT_SPEC_P (d_spec)
+      else if (!DECL_MAYBE_DELETED (d_inner)
+              && !DEFERRED_NOEXCEPT_SPEC_P (d_spec)
               && !comp_except_specs (d_spec, e_spec, ce_type))
        {
          mismatch_msg = G_("conflicting %<noexcept%> specifier for "
@@ -12195,6 +12196,8 @@ trees_in::is_matching_decl (tree existing, tree decl, bool is_typedef)
       if (DECL_MAYBE_DELETED (e_inner) && !DECL_MAYBE_DELETED (d_inner)
          && DECL_DECLARED_CONSTEXPR_P (d_inner))
        DECL_DECLARED_CONSTEXPR_P (e_inner) = true;
+      else if (!DECL_MAYBE_DELETED (e_inner) && DECL_MAYBE_DELETED (d_inner))
+       /* Nothing to do.  */;
       else if (DECL_DECLARED_CONSTEXPR_P (e_inner)
               != DECL_DECLARED_CONSTEXPR_P (d_inner))
        {
diff --git a/gcc/testsuite/g++.dg/modules/noexcept-4_a.H b/gcc/testsuite/g++.dg/modules/noexcept-4_a.H
new file mode 100644 (file)
index 0000000..b888a1b
--- /dev/null
@@ -0,0 +1,6 @@
+// { dg-additional-options "-fmodule-header -std=c++20" }
+// { dg-module-cmi {} }
+
+struct exception_ptr {
+  friend bool operator==(const exception_ptr&, const exception_ptr&) = default;
+};
diff --git a/gcc/testsuite/g++.dg/modules/noexcept-4_b.C b/gcc/testsuite/g++.dg/modules/noexcept-4_b.C
new file mode 100644 (file)
index 0000000..7cc5531
--- /dev/null
@@ -0,0 +1,18 @@
+// { dg-additional-options "-fmodules -std=c++20" }
+
+struct exception_ptr {
+  friend bool operator==(const exception_ptr&, const exception_ptr&) = default;
+};
+
+void enqueue() {
+  exception_ptr e;
+  e == e;
+}
+
+import "noexcept-4_a.H";
+
+int main() {
+  constexpr exception_ptr e;
+  static_assert(e == e);
+  static_assert(noexcept(e == e));
+}