diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c03f66a7ad6..ba1f775c055 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-09-25 Zhenqiang Chen + + PR c++/50970 + * typeck.c (cp_build_binary_op): Check side effects before generating + pfn and delta related expressions. + 2012-09-24 Lawrence Crowl * init.c (build_new_1): Change to new double_int API. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index ad4b0903d67..884f7d0573b 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