On Tue, 17 Sep 2024, Marek Polacek wrote: > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/14/13?
Why not backport this to 12 as well? > > -- >8 -- > 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. > --- > gcc/cp/constexpr.cc | 1 + > gcc/testsuite/g++.dg/cpp1z/constexpr-116676.C | 57 +++++++++++++++++++ > 2 files changed, 58 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/cpp1z/constexpr-116676.C > > diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc > index d0f61748141..c3668b0d7d3 100644 > --- a/gcc/cp/constexpr.cc > +++ b/gcc/cp/constexpr.cc > @@ -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 ()) > diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-116676.C > b/gcc/testsuite/g++.dg/cpp1z/constexpr-116676.C > new file mode 100644 > index 00000000000..1cb65f10a1d > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-116676.C > @@ -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}; > +} > + > > base-commit: a92f54f580c37732a5de01e47aed56882231f196 > -- > 2.46.0 > >