Fix is_noexcept crash

This ICE showed up after rebasing.
This commit is contained in:
Marek Polacek
2025-12-15 17:21:45 -05:00
parent 39c4c97dbf
commit c5798790c8
2 changed files with 30 additions and 40 deletions

View File

@@ -2781,13 +2781,7 @@ eval_is_noexcept (tree r)
if (eval_is_function (r) == boolean_true_node)
{
r = maybe_get_reflection_fndecl (r);
if (TREE_CODE (r) == FUNCTION_DECL
&& DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (r))
{
bool no_err = maybe_instantiate_noexcept (r);
gcc_assert (no_err);
}
maybe_instantiate_noexcept (r);
if (TYPE_NOTHROW_P (TREE_TYPE (r)))
return boolean_true_node;
else

View File

@@ -1,6 +1,6 @@
// { dg-do compile { target c++26 } }
// { dg-additional-options "-freflection" }
// Test std::meta::is_deleted.
// Test std::meta::is_noexcept.
#include <meta>
#include <vector>
@@ -15,7 +15,7 @@ struct Mem {
Mem& operator=(Mem const&) noexcept(Noex);
Mem& operator=(Mem&&) noexcept(Noex);
~Mem() noexcept(Noex);
bool operator==(const Mem&) const noexcept(Noex);
std::strong_ordering operator<=>(const Mem&) const noexcept(Noex);
};
@@ -38,25 +38,24 @@ struct ExplicitDef
ExplicitDef& operator=(const ExplicitDef&) = default;
ExplicitDef& operator=(ExplicitDef&&) = default;
~ExplicitDef() = default;
Mem<Noex> d;
};
// FIXME crashes here.
// static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_default_constructor)));
// static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_copy_constructor)));
// static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_move_constructor)));
// static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_copy_assignment)));
// static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_move_assignment)));
static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_default_constructor)));
static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_copy_constructor)));
static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_move_constructor)));
static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_copy_assignment)));
static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_move_assignment)));
static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_destructor)));
// static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_default_constructor)));
// static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_copy_constructor)));
// static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_move_constructor)));
// static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_copy_assignment)));
// static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_move_assignment)));
static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_default_constructor)));
static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_copy_constructor)));
static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_move_constructor)));
static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_copy_assignment)));
static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_move_assignment)));
static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_destructor)));
template<bool Noex>
@@ -65,18 +64,18 @@ struct ImplicitDef
Mem<Noex> d;
};
// static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_default_constructor)));
// static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_copy_constructor)));
// static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_move_constructor)));
// static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_copy_assignment)));
// static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_move_assignment)));
static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_default_constructor)));
static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_copy_constructor)));
static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_move_constructor)));
static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_copy_assignment)));
static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_move_assignment)));
static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_destructor)));
// static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_default_constructor)));
// static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_copy_constructor)));
// static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_move_constructor)));
// static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_copy_assignment)));
// static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_move_assignment)));
static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_default_constructor)));
static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_copy_constructor)));
static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_move_constructor)));
static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_copy_assignment)));
static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_move_assignment)));
static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_destructor)));
template<bool Noex>
@@ -84,12 +83,11 @@ struct ExplicitRelOps
{
bool operator==(const ExplicitRelOps&) const = default;
auto operator<=>(const ExplicitRelOps&) const = default;
Mem<Noex> d;
};
// FIXME requires operator== and operator<=> to be used
static_assert (!is_noexcept (^^ExplicitRelOps<true>::operator==));
static_assert (!is_noexcept (^^ExplicitRelOps<true>::operator<=>));
static_assert (is_noexcept (^^ExplicitRelOps<true>::operator==));
static_assert (is_noexcept (^^ExplicitRelOps<true>::operator<=>));
ExplicitRelOps<true> x1;
static_assert (noexcept (x1 == x1));
@@ -105,13 +103,12 @@ struct ImplicitRelOps
{
// operator== is implicitly declared
auto operator<=>(const ImplicitRelOps&) const = default;
Mem<Noex> d;
};
// FIXME requires operator== and operator<=> to be used
static_assert (!is_noexcept (^^ImplicitRelOps<true>::operator==));
static_assert (!is_noexcept (^^ImplicitRelOps<true>::operator<=>));
static_assert (is_noexcept (^^ImplicitRelOps<true>::operator==));
static_assert (is_noexcept (^^ImplicitRelOps<true>::operator<=>));
ImplicitRelOps<true> x2;
static_assert (noexcept (x2 == x2));
@@ -121,4 +118,3 @@ static_assert (is_noexcept (^^ImplicitRelOps<true>::operator<=>));
static_assert (!is_noexcept (^^ImplicitRelOps<false>::operator==));
static_assert (!is_noexcept (^^ImplicitRelOps<false>::operator<=>));