mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 05:44:15 +08:00
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:
parent
e311dd13a9
commit
dfe0d4389a
@ -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 ())
|
||||
|
57
gcc/testsuite/g++.dg/cpp1z/constexpr-116676.C
Normal file
57
gcc/testsuite/g++.dg/cpp1z/constexpr-116676.C
Normal 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};
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user