c++: crash with anon VAR_DECL [PR116676]

r12-3495 added maybe_warn_about_constant_value which will crash if
it gets a nameless VAR_DECL, which is what happens in this PR.

We created this VAR_DECL in cp_parser_decomposition_declaration.

	PR c++/116676

gcc/cp/ChangeLog:

	* constexpr.cc (maybe_warn_about_constant_value): Check DECL_NAME.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp1z/constexpr-116676.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
This commit is contained in:
Marek Polacek 2024-09-16 16:42:38 -04:00
parent e311dd13a9
commit dfe0d4389a
2 changed files with 58 additions and 0 deletions

View File

@ -7222,6 +7222,7 @@ maybe_warn_about_constant_value (location_t loc, tree decl)
&& warn_interference_size
&& !OPTION_SET_P (param_destruct_interfere_size)
&& DECL_CONTEXT (decl) == std_node
&& DECL_NAME (decl)
&& id_equal (DECL_NAME (decl), "hardware_destructive_interference_size")
&& (LOCATION_FILE (input_location) != main_input_filename
|| module_exporting_p ())

View File

@ -0,0 +1,57 @@
// PR c++/116676
// { dg-do compile { target c++17 } }
namespace std {
typedef __SIZE_TYPE__ size_t;
template<typename _Tp>
struct remove_reference
{ typedef _Tp type; };
template<typename _Tp>
struct remove_reference<_Tp&>
{ typedef _Tp type; };
template<typename _Tp>
struct remove_reference<_Tp&&>
{ typedef _Tp type; };
template <typename _Tp>
constexpr typename std::remove_reference<_Tp>::type &&
move(_Tp &&__t) noexcept {
return static_cast<typename std::remove_reference<_Tp>::type &&>(__t);
}
template <typename _Tp> struct tuple_size;
template <size_t __i, typename _Tp> struct tuple_element;
template <typename _U1, typename _U2> class __pair_base {};
template <typename _T1, typename _T2>
struct pair {
_T1 first;
_T2 second;
template <typename _U1 = _T1, typename _U2 = _T2>
explicit constexpr pair(const _T1 &__a, const _T2 &__b)
: first(__a), second(__b) {}
};
template <class _Tp1, class _Tp2>
struct tuple_size<pair<_Tp1, _Tp2>>
{
static constexpr size_t value = 2;
};
template <class _Tp1, class _Tp2>
struct tuple_element<0, pair<_Tp1, _Tp2>> {
typedef _Tp1 type;
};
template <class _Tp1, class _Tp2>
struct tuple_element<1, pair<_Tp1, _Tp2>> {
typedef _Tp2 type;
};
template <size_t _Int, class _Tp1, class _Tp2>
constexpr typename tuple_element<_Int, pair<_Tp1, _Tp2>>::type &
get(pair<_Tp1, _Tp2> &&__in) noexcept {
return (std::move(__in).first);
}
int t;
auto [a, b] = std::pair<int&, int>{t, 1};
}