From 530ec96d294a83afc075059b13eb72cc07d9465d Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 13 Apr 2001 21:16:42 +0000 Subject: [PATCH] cp-tree.h (DELTA2_FROM_PTRMEMFUNC): Remove. * cp-tree.h (DELTA2_FROM_PTRMEMFUNC): Remove. (expand_ptremfunc_cst): Change prototype. (delta2_from_ptrmemfunc): Remove. * expr.c (cplus_expand_constant): Adjust call to expand_ptrmemfunc_cst. * typeck.c (build_ptrmemfunc1): Simplify. (build_ptrmemfunc): Make sure that casting a PTRMEM_CST still results in a constant. (expand_ptrmemfunc_cst): Remove idx and delta2 parameters. (delta2_from_ptrmemfunc): Remove. (pfn_from_ptrmemfunc): Adjust call to expand_ptrmemfunc_cst. From-SVN: r41341 --- gcc/cp/ChangeLog | 14 +++++++ gcc/cp/cp-tree.h | 6 +-- gcc/cp/expr.c | 5 ++- gcc/cp/typeck.c | 98 ++++++++++-------------------------------------- 4 files changed, 38 insertions(+), 85 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0ae306fa069..53616a3341c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,17 @@ +2001-04-13 Mark Mitchell + + * cp-tree.h (DELTA2_FROM_PTRMEMFUNC): Remove. + (expand_ptremfunc_cst): Change prototype. + (delta2_from_ptrmemfunc): Remove. + * expr.c (cplus_expand_constant): Adjust call to + expand_ptrmemfunc_cst. + * typeck.c (build_ptrmemfunc1): Simplify. + (build_ptrmemfunc): Make sure that casting a PTRMEM_CST still + results in a constant. + (expand_ptrmemfunc_cst): Remove idx and delta2 parameters. + (delta2_from_ptrmemfunc): Remove. + (pfn_from_ptrmemfunc): Adjust call to expand_ptrmemfunc_cst. + 2001-04-12 Jason Merrill * cp-tree.h (decl_namespace_list): New macro. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index b1d3ee4c3df..de82fa6981c 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2688,8 +2688,7 @@ extern int flag_new_for_scope; hashed POINTER_TYPE, and can only be used on the POINTER_TYPE. */ #define TYPE_GET_PTRMEMFUNC_TYPE(NODE) ((tree)TYPE_LANG_SPECIFIC(NODE)) #define TYPE_SET_PTRMEMFUNC_TYPE(NODE, VALUE) (TYPE_LANG_SPECIFIC(NODE) = ((struct lang_type *)(void*)(VALUE))) -/* These are to get the delta2 and pfn fields from a TYPE_PTRMEMFUNC_P. */ -#define DELTA2_FROM_PTRMEMFUNC(NODE) delta2_from_ptrmemfunc ((NODE)) +/* Returns the pfn field from a TYPE_PTRMEMFUNC_P. */ #define PFN_FROM_PTRMEMFUNC(NODE) pfn_from_ptrmemfunc ((NODE)) /* For a pointer-to-member type of the form `T X::*', this is `X'. */ @@ -4461,8 +4460,7 @@ extern int cp_has_mutable_p PARAMS ((tree)); extern int at_least_as_qualified_p PARAMS ((tree, tree)); extern int more_qualified_p PARAMS ((tree, tree)); extern tree build_ptrmemfunc1 PARAMS ((tree, tree, tree)); -extern void expand_ptrmemfunc_cst PARAMS ((tree, tree *, tree *, tree *, tree *)); -extern tree delta2_from_ptrmemfunc PARAMS ((tree)); +extern void expand_ptrmemfunc_cst PARAMS ((tree, tree *, tree *)); extern tree pfn_from_ptrmemfunc PARAMS ((tree)); extern tree type_after_usual_arithmetic_conversions PARAMS ((tree, tree)); extern tree composite_pointer_type PARAMS ((tree, tree, tree, tree, diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c index 9a9eb86f526..6855160fc19 100644 --- a/gcc/cp/expr.c +++ b/gcc/cp/expr.c @@ -60,9 +60,10 @@ cplus_expand_constant (cst) } else { - tree delta, idx, pfn, delta2; + tree delta; + tree pfn; - expand_ptrmemfunc_cst (cst, &delta, &idx, &pfn, &delta2); + expand_ptrmemfunc_cst (cst, &delta, &pfn); cst = build_ptrmemfunc1 (type, delta, pfn); } } diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 139290bb166..5371c0e9977 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -6000,51 +6000,25 @@ build_ptrmemfunc1 (type, delta, pfn) { tree u = NULL_TREE; tree delta_field; - tree idx_field; - tree pfn_or_delta2_field; tree pfn_field; - tree delta2_field; - tree subtype; - int allconstant, allsimple; /* Pull the FIELD_DECLs out of the type. */ pfn_field = TYPE_FIELDS (type); delta_field = TREE_CHAIN (pfn_field); - idx_field = NULL_TREE; - pfn_or_delta2_field = NULL_TREE; - delta2_field = NULL_TREE; - subtype = NULL_TREE; /* Make sure DELTA has the type we want. */ delta = convert_and_check (delta_type_node, delta); - /* Keep track of whether the initializer is a) constant, and b) can - be done statically. */ - allconstant = TREE_CONSTANT (delta); - allsimple = (initializer_constant_valid_p (delta, TREE_TYPE (delta)) - != NULL_TREE); - - if (pfn) - { - /* A non-virtual function. */ - allconstant &= TREE_CONSTANT (pfn); - allsimple &= (initializer_constant_valid_p (pfn, TREE_TYPE (pfn)) - != NULL_TREE); - } - else - { - /* A virtual function. */ - allconstant &= TREE_CONSTANT (pfn); - allsimple &= (initializer_constant_valid_p (pfn, TREE_TYPE (pfn)) - != NULL_TREE); - } - /* Finish creating the initializer. */ u = tree_cons (pfn_field, pfn, build_tree_list (delta_field, delta)); u = build (CONSTRUCTOR, type, NULL_TREE, u); - TREE_CONSTANT (u) = allconstant; - TREE_STATIC (u) = allconstant && allsimple; + TREE_CONSTANT (u) = TREE_CONSTANT (pfn) && TREE_CONSTANT (delta); + TREE_STATIC (u) = (TREE_CONSTANT (u) + && (initializer_constant_valid_p (pfn, TREE_TYPE (pfn)) + != NULL_TREE) + && (initializer_constant_valid_p (delta, TREE_TYPE (delta)) + != NULL_TREE)); return u; } @@ -6071,7 +6045,7 @@ build_ptrmemfunc (type, pfn, force) /* Handle multiple conversions of pointer to member functions. */ if (TYPE_PTRMEMFUNC_P (TREE_TYPE (pfn))) { - tree delta = integer_zero_node; + tree delta = NULL_TREE; tree npfn = NULL_TREE; tree n; @@ -6099,10 +6073,17 @@ build_ptrmemfunc (type, pfn, force) if (TREE_SIDE_EFFECTS (pfn)) pfn = save_expr (pfn); + /* Obtain the function pointer and the current DELTA. */ + if (TREE_CODE (pfn) == PTRMEM_CST) + expand_ptrmemfunc_cst (pfn, &delta, &npfn); + else + { + npfn = build_component_ref (pfn, pfn_identifier, NULL_TREE, 0); + delta = build_component_ref (pfn, delta_identifier, NULL_TREE, 0); + } + /* Under the new ABI, the conversion is easy. Just adjust the DELTA field. */ - npfn = build_component_ref (pfn, pfn_identifier, NULL_TREE, 0); - delta = build_component_ref (pfn, delta_identifier, NULL_TREE, 0); delta = cp_convert (ptrdiff_type_node, delta); delta = cp_build_binary_op (PLUS_EXPR, delta, n); return build_ptrmemfunc1 (to_type, delta, npfn); @@ -6133,12 +6114,10 @@ build_ptrmemfunc (type, pfn, force) integer_type_node. */ void -expand_ptrmemfunc_cst (cst, delta, idx, pfn, delta2) +expand_ptrmemfunc_cst (cst, delta, pfn) tree cst; tree *delta; - tree *idx; tree *pfn; - tree *delta2; { tree type = TREE_TYPE (cst); tree fn = PTRMEM_CST_MEMBER (cst); @@ -6156,11 +6135,7 @@ expand_ptrmemfunc_cst (cst, delta, idx, pfn, delta2) *delta = get_delta_difference (fn_class, ptr_class, /*force=*/0); if (!DECL_VIRTUAL_P (fn)) - { - *idx = NULL_TREE; - *pfn = convert (TYPE_PTRMEMFUNC_FN_TYPE (type), build_addr_func (fn)); - *delta2 = NULL_TREE; - } + *pfn = convert (TYPE_PTRMEMFUNC_FN_TYPE (type), build_addr_func (fn)); else { /* If we're dealing with a virtual function, we have to adjust 'this' @@ -6173,7 +6148,6 @@ expand_ptrmemfunc_cst (cst, delta, idx, pfn, delta2) /* Under the new ABI, we set PFN to the vtable offset, plus one, at which the function can be found. */ - *idx = NULL_TREE; *pfn = fold (build (MULT_EXPR, integer_type_node, DECL_VINDEX (fn), TYPE_SIZE_UNIT (vtable_entry_type))); @@ -6181,41 +6155,9 @@ expand_ptrmemfunc_cst (cst, delta, idx, pfn, delta2) integer_one_node)); *pfn = fold (build1 (NOP_EXPR, TYPE_PTRMEMFUNC_FN_TYPE (type), *pfn)); - - /* Offset from an object of PTR_CLASS to the vptr for ORIG_CLASS. */ - *delta2 = fold (build (PLUS_EXPR, integer_type_node, *delta, - get_vfield_offset (TYPE_BINFO (orig_class)))); } } -/* Return an expression for DELTA2 from the pointer-to-member function - given by T. */ - -tree -delta2_from_ptrmemfunc (t) - tree t; -{ - my_friendly_assert (0, 20000221); - - if (TREE_CODE (t) == PTRMEM_CST) - { - tree delta; - tree idx; - tree pfn; - tree delta2; - - expand_ptrmemfunc_cst (t, &delta, &idx, &pfn, &delta2); - if (delta2) - return delta2; - } - - return (build_component_ref - (build_component_ref (t, - pfn_or_delta2_identifier, NULL_TREE, - 0), - delta2_identifier, NULL_TREE, 0)); -} - /* Return an expression for PFN from the pointer-to-member function given by T. */ @@ -6226,11 +6168,9 @@ pfn_from_ptrmemfunc (t) if (TREE_CODE (t) == PTRMEM_CST) { tree delta; - tree idx; tree pfn; - tree delta2; - expand_ptrmemfunc_cst (t, &delta, &idx, &pfn, &delta2); + expand_ptrmemfunc_cst (t, &delta, &pfn); if (pfn) return pfn; } -- 2.30.2