c++/modules: More fixes for merging DECL_MAYBE_DELETED functions

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>
This commit is contained in:
Nathaniel Shead 2025-04-11 07:29:11 +10:00
parent 714e9020be
commit f40e39515e
3 changed files with 28 additions and 1 deletions

View 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))
{

View file

@ -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;
};

View file

@ -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));
}