On 20 Sep 2012, at 08:51, "Zhenqiang Chen" <zhenqiang.c...@linaro.org> wrote:
> Hi, > > PR 50970 is a general c++ front-end issue for targets which define > TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_delta, although the > reporter had issues only on ARM. > > Root cause: It misses a check for side effects when generating pfn and > delta related expressions. > > In the failed case, op0 is a function call. pfn0 and delta0 are > expressions based on the return value of op0. Without the check, the > function will be called twice. > > The patch is to add the check for op0. > > No make check regression on ARM. > > Is it OK for trunk? > > Thanks! > -Zhenqiang > > cp/ChangeLog: > 2012-09-20 Zhenqiang Chen <zhenqiang.c...@linaro.org> > > PR c++/50970 > * typeck.c (cp_build_binary_op): Check side effects before generating > pfn and delta related expressions. > Ok. R. > diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c > index ad4b090..884f7d0 100644 > --- a/gcc/cp/typeck.c > +++ b/gcc/cp/typeck.c > @@ -4159,18 +4159,23 @@ cp_build_binary_op (location_t location, > if (TARGET_PTRMEMFUNC_VBIT_LOCATION > == ptrmemfunc_vbit_in_delta) > { > - tree pfn0 = pfn_from_ptrmemfunc (op0); > - tree delta0 = delta_from_ptrmemfunc (op0); > - tree e1 = cp_build_binary_op (location, > - EQ_EXPR, > - pfn0, > - build_zero_cst (TREE_TYPE (pfn0)), > - complain); > - tree e2 = cp_build_binary_op (location, > - BIT_AND_EXPR, > - delta0, > - integer_one_node, > - complain); > + tree pfn0, delta0, e1, e2; > + > + if (TREE_SIDE_EFFECTS (op0)) > + op0 = save_expr (op0); > + > + pfn0 = pfn_from_ptrmemfunc (op0); > + delta0 = delta_from_ptrmemfunc (op0); > + e1 = cp_build_binary_op (location, > + EQ_EXPR, > + pfn0, > + build_zero_cst (TREE_TYPE (pfn0)), > + complain); > + e2 = cp_build_binary_op (location, > + BIT_AND_EXPR, > + delta0, > + integer_one_node, > + complain); > > if ((complain & tf_warning) > && c_inhibit_evaluation_warnings == 0 >