On Tue, 18 Mar 2025, Marek Polacek wrote:

> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/14?
> 
> -- >8 --
> This ICE appeared with the removal of NON_DEPENDENT_EXPR.  Previously
> skip_simple_arithmetic would get NON_DEPENDENT_EXPR<CAST_EXPR<>> and
> since NON_DEPENDENT_EXPR is neither BINARY_CLASS_P nor UNARY_CLASS_P,
> there was no problem.  But now we pass just CAST_EXPR<> and a CAST_EXPR
> is a tcc_unary, so we extract its null operand and crash.
> 
> skip_simple_arithmetic is called from save_expr.  cp_save_expr already
> avoids calling save_expr in a template, so that seems like an appropriate
> way to fix this.
> 
>       PR c++/119344
> 
> gcc/cp/ChangeLog:
> 
>       * typeck.cc (cp_build_binary_op): Use cp_save_expr instead of save_expr.
> 
> gcc/testsuite/ChangeLog:
> 
>       * g++.dg/conversion/ptrmem10.C: New test.

LGTM.  I'm surprised the CAST_EXPR for 'T()' has TREE_SIDE_EFFECTS set
here, since it's just value initialization of scalar type.

> ---
>  gcc/cp/typeck.cc                           |  4 ++--
>  gcc/testsuite/g++.dg/conversion/ptrmem10.C | 14 ++++++++++++++
>  2 files changed, 16 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem10.C
> 
> diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
> index 4b382b95de1..5cd1295123f 100644
> --- a/gcc/cp/typeck.cc
> +++ b/gcc/cp/typeck.cc
> @@ -6019,9 +6019,9 @@ cp_build_binary_op (const op_location_t &location,
>           return error_mark_node;
>  
>         if (TREE_SIDE_EFFECTS (op0))
> -         op0 = save_expr (op0);
> +         op0 = cp_save_expr (op0);
>         if (TREE_SIDE_EFFECTS (op1))
> -         op1 = save_expr (op1);
> +         op1 = cp_save_expr (op1);
>  
>         pfn0 = pfn_from_ptrmemfunc (op0);
>         pfn0 = cp_fully_fold (pfn0);
> diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem10.C 
> b/gcc/testsuite/g++.dg/conversion/ptrmem10.C
> new file mode 100644
> index 00000000000..b5fc050ee81
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/conversion/ptrmem10.C
> @@ -0,0 +1,14 @@
> +// PR c++/119344
> +// { dg-do compile { target c++11 } }
> +
> +struct S {
> +    void fn();
> +};
> +typedef void (S::*T)(void);
> +template <T Ptr>
> +struct s
> +{
> +  static const bool t = Ptr != T();
> +};
> +
> +int t1 = s<&S::fn>::t;
> 
> base-commit: 82bb1890aeab275541f8d3606641e8c0cadc9659
> -- 
> 2.48.1
> 
> 

Reply via email to