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
> 
> 

Reply via email to