diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-21 21:23:42 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-21 21:23:42 +0000 |
commit | cb02169c17a604d6355aab650a3c33d664aabca4 (patch) | |
tree | f2b7fac0767818e1f51fd05dc1e3af743cc2df4b /gcc/cp/call.c | |
parent | 5534465383bb5b22d5f88321b0d764c85acbd41a (diff) | |
download | gcc-cb02169c17a604d6355aab650a3c33d664aabca4.tar.gz |
PR c++/18073
PR c++/10841
* cp-tree.h (convert_to_base): Change prototype.
(build_ptrmemfunc): Likewise.
(convert_ptrmem): New function.
* call.c (struct conversion): Adjust documentation for base_p.
(standard_conversion): Set base_p for ck_pmem conversions as
appropriate.
(convert_like_real): Use convert_to_base for ck_pmem and ck_ptr
conversions.
* class.c (convert_to_base): Handle both pointers and objects.
Add nonnull parameter.
(build_vfield_ref): Adjust call to convert_to_base.
* cvt.c (cp_convert_to_pointer): Adjust call to build_ptrmemfunc.
(convert_force): Likewise.
* typeck.c (build_unary_op): Likewise.
(convert_ptrmem): New function.
(build_static_cast_1): Use it.
(build_reinterpret_cast): Allow conversions to vector types.
(get_delta_difference): Add c_cast_p parameter.
(build_ptrmemfunc): Likewise. Adjust calls to
get_delta_difference.
PR c++/10841
* g++.dg/conversion/cast1.C: New test.
* g++.dg/overload/pmf1.C: Adjust error marker.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89403 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/call.c')
-rw-r--r-- | gcc/cp/call.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 46b270e3ff3..aedc9278b9d 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -92,8 +92,8 @@ struct conversion { copy constructor must be accessible, even though it is not being used. */ BOOL_BITFIELD check_copy_constructor_p : 1; - /* If KIND is ck_ptr, true to indicate that a conversion from a - pointer-to-derived to pointer-to-base is being performed. */ + /* If KIND is ck_ptr or ck_pmem, true to indicate that a conversion + from a pointer-to-derived to pointer-to-base is being performed. */ BOOL_BITFIELD base_p : 1; /* The type of the expression resulting from the conversion. */ tree type; @@ -779,6 +779,7 @@ standard_conversion (tree to, tree from, tree expr) TREE_CHAIN (TYPE_ARG_TYPES (fromfn))); from = build_ptrmemfunc_type (build_pointer_type (from)); conv = build_conv (ck_pmem, from, conv); + conv->base_p = true; } else if (tcode == BOOLEAN_TYPE) { @@ -4270,8 +4271,8 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, check_constructor_callable (TREE_TYPE (expr), expr); /* Build an expression for `*((base*) &expr)'. */ expr = build_unary_op (ADDR_EXPR, expr, 0); - expr = perform_implicit_conversion (build_pointer_type (totype), - expr); + expr = convert_to_base (expr, build_pointer_type (totype), + !c_cast_p, /*nonnull=*/true); expr = build_indirect_ref (expr, "implicit conversion"); return expr; } @@ -4338,19 +4339,14 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, case ck_ptr: if (convs->base_p) - { - tree binfo; - - binfo = lookup_base (TREE_TYPE (TREE_TYPE (expr)), - TREE_TYPE (totype), - c_cast_p ? ba_unique : ba_check, - NULL); - if (binfo == error_mark_node) - return error_mark_node; - expr = build_base_path (PLUS_EXPR, expr, binfo, /*nonnull=*/0); - } + expr = convert_to_base (expr, totype, !c_cast_p, + /*nonnull=*/false); return build_nop (totype, expr); + case ck_pmem: + return convert_ptrmem (totype, expr, /*allow_inverse_p=*/false, + c_cast_p); + default: break; } |