mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
Fix is_noexcept crash
This ICE showed up after rebasing.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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<=>));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user