summaryrefslogtreecommitdiffstats
path: root/gcc/cp/typeck.c
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2000-12-22 23:31:55 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2000-12-22 23:31:55 +0000
commit815b1d7562b1b72ad03151b9a8ac4a1986338b67 (patch)
tree5dd6a7c52f5b1d37ad2e46570ccb0b8e9b84a338 /gcc/cp/typeck.c
parenta8e635bab272c7afce18d07df4d6a57bf3086700 (diff)
downloadppe42-gcc-815b1d7562b1b72ad03151b9a8ac4a1986338b67.tar.gz
ppe42-gcc-815b1d7562b1b72ad03151b9a8ac4a1986338b67.zip
* typeck.c (build_binary_op): Fix pmf comparison logic.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38471 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/typeck.c')
-rw-r--r--gcc/cp/typeck.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 8de99f6d3ab..23efc90a9ef 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -3648,6 +3648,11 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
tree e1;
tree e2;
+ if (TREE_SIDE_EFFECTS (op0))
+ op0 = save_expr (op0);
+ if (TREE_SIDE_EFFECTS (op1))
+ op1 = save_expr (op1);
+
if (flag_new_abi)
{
/* We generate:
@@ -3670,7 +3675,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
delta1 = build_component_ref (op1, delta_identifier,
NULL_TREE, 0);
e1 = cp_build_binary_op (EQ_EXPR, delta0, delta1);
- e2 = cp_build_binary_op (NE_EXPR,
+ e2 = cp_build_binary_op (EQ_EXPR,
pfn0,
cp_convert (TREE_TYPE (pfn0),
integer_zero_node));
@@ -3683,13 +3688,19 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
/* The code we generate for the test is:
(op0.index == op1.index
- && ((op1.index != -1 && op0.delta2 == op1.delta2)
- || op0.pfn == op1.pfn)) */
+ && op0.delta == op1.delta
+ && (op1.index == -1 ? op0.pfn == op1.pfn
+ : op0.delta2 == op1.delta2)) */
tree index0 = build_component_ref (op0, index_identifier,
NULL_TREE, 0);
- tree index1 = save_expr (build_component_ref (op1, index_identifier,
- NULL_TREE, 0));
+ tree index1
+ = save_expr (build_component_ref (op1, index_identifier,
+ NULL_TREE, 0));
+ tree delta0 = build_component_ref (op0, delta_identifier,
+ NULL_TREE, 0);
+ tree delta1 = build_component_ref (op1, delta_identifier,
+ NULL_TREE, 0);
tree pfn0 = PFN_FROM_PTRMEMFUNC (op0);
tree pfn1 = PFN_FROM_PTRMEMFUNC (op1);
tree delta20 = DELTA2_FROM_PTRMEMFUNC (op0);
@@ -3698,17 +3709,17 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
tree integer_neg_one_node
= cp_build_binary_op (MINUS_EXPR, integer_zero_node,
integer_one_node);
- e1 = cp_build_binary_op (EQ_EXPR, index0, index1);
- e2 = cp_build_binary_op (NE_EXPR, index1, integer_neg_one_node);
- e2 = cp_build_binary_op (TRUTH_ANDIF_EXPR, e2,
- cp_build_binary_op (EQ_EXPR,
- delta20, delta21));
+ e1 = cp_build_binary_op (EQ_EXPR, index1, integer_neg_one_node);
/* We can't use build_binary_op for this cmp because it
would get confused by the ptr to method types and
think we want pmfs. */
- e3 = build (EQ_EXPR, boolean_type_node, pfn0, pfn1);
- e2 = cp_build_binary_op (TRUTH_ORIF_EXPR, e2, e3);
- e = cp_build_binary_op (TRUTH_ANDIF_EXPR, e1, e2);
+ e2 = build (EQ_EXPR, boolean_type_node, pfn0, pfn1);
+ e3 = cp_build_binary_op (EQ_EXPR, delta20, delta21);
+ e = build_conditional_expr (e1, e2, e3);
+ e1 = cp_build_binary_op (EQ_EXPR, index0, index1);
+ e = cp_build_binary_op (TRUTH_ANDIF_EXPR, e1, e);
+ e1 = cp_build_binary_op (EQ_EXPR, delta0, delta1);
+ e = cp_build_binary_op (TRUTH_ANDIF_EXPR, e1, e);
}
if (code == EQ_EXPR)
return e;
OpenPOWER on IntegriCloud