On 22 September 2012 06:42,  <rearn...@arm.com> wrote:
> 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.

Thanks, committed to trunk.

The bug also happens in FSF 4.7. Can I backport it to 4.7?

Thanks!
-Zhenqiang


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

Reply via email to