Hello, This patch was accepted[1] before stage-1. I have rebased, bootstrapped and tested it against trunk on x86_64-unknown-linux-gnu.
Applying to trunk. [1]: http://gcc.gnu.org/ml/gcc-patches/2011-12/msg01145.html gcc/cp/ * call.c (standard_conversion, build_integral_nontype_arg_conv) (build_new_op_1, convert_like_real, is_subseq) (maybe_handle_implicit_object, maybe_handle_ref_bind, compare_ics) (joust): Use next_conversion instead of accessing fields of struct conversion directly. --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/call.c | 50 +++++++++++++++++++++++++------------------------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1a3ac83..f04ac60 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2011-12-15 Dodji Seketeli <do...@redhat.com> + + * call.c (standard_conversion, build_integral_nontype_arg_conv) + (build_new_op_1, convert_like_real, is_subseq) + (maybe_handle_implicit_object, maybe_handle_ref_bind, compare_ics) + (joust): Use next_conversion instead of accessing fields of struct + conversion directly. + 2012-03-12 Paolo Carlini <paolo.carl...@oracle.com> PR c++/52299 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 0bf3bb1..88733f5 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -1325,7 +1325,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, /* Give this a better rank if it's a promotion. */ if (same_type_p (to, type_promotes_to (from)) - && conv->u.next->rank <= cr_promotion) + && next_conversion (conv)->rank <= cr_promotion) conv->rank = cr_promotion; } else if (fcode == VECTOR_TYPE && tcode == VECTOR_TYPE @@ -1335,7 +1335,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, && is_properly_derived_from (from, to)) { if (conv->kind == ck_rvalue) - conv = conv->u.next; + conv = next_conversion (conv); conv = build_conv (ck_base, to, conv); /* The derived-to-base conversion indicates the initialization of a parameter with base type from an object of a derived @@ -3697,7 +3697,7 @@ build_integral_nontype_arg_conv (tree type, tree expr, tsubst_flags_t complain) break; case ck_std: - t = conv->u.next->type; + t = next_conversion (conv)->type; if (INTEGRAL_OR_ENUMERATION_TYPE_P (t)) break; @@ -5145,7 +5145,7 @@ build_new_op_1 (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, objects directly. */ conv = cand->convs[0]; if (conv->kind == ck_ref_bind) - conv = conv->u.next; + conv = next_conversion (conv); arg1 = convert_like (conv, arg1, complain); if (arg2) @@ -5159,14 +5159,14 @@ build_new_op_1 (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, conv = cand->convs[1]; if (conv->kind == ck_ref_bind) - conv = conv->u.next; + conv = next_conversion (conv); arg2 = convert_like (conv, arg2, complain); } if (arg3) { conv = cand->convs[2]; if (conv->kind == ck_ref_bind) - conv = conv->u.next; + conv = next_conversion (conv); arg3 = convert_like (conv, arg3, complain); } @@ -5806,7 +5806,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, break; }; - expr = convert_like_real (convs->u.next, expr, fn, argnum, + expr = convert_like_real (next_conversion (convs), expr, fn, argnum, convs->kind == ck_ref_bind ? -1 : 1, convs->kind == ck_ref_bind ? issue_conversion_warnings : false, c_cast_p, @@ -5859,7 +5859,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, { tree ref_type = totype; - if (convs->bad_p && !convs->u.next->bad_p) + if (convs->bad_p && !next_conversion (convs)->bad_p) { gcc_assert (TYPE_REF_IS_RVALUE (ref_type) && real_lvalue_p (expr)); @@ -5889,7 +5889,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, cp_lvalue_kind lvalue = real_lvalue_p (expr); gcc_assert (same_type_ignoring_top_level_qualifiers_p - (type, convs->u.next->type)); + (type, next_conversion (convs)->type)); if (!CP_TYPE_CONST_NON_VOLATILE_P (type) && !TYPE_REF_IS_RVALUE (ref_type)) { @@ -7424,13 +7424,13 @@ is_subseq (conversion *ics1, conversion *ics2) while (ics1->kind == ck_rvalue || ics1->kind == ck_lvalue) - ics1 = ics1->u.next; + ics1 = next_conversion (ics1); while (1) { while (ics2->kind == ck_rvalue || ics2->kind == ck_lvalue) - ics2 = ics2->u.next; + ics2 = next_conversion (ics2); if (ics2->kind == ck_user || ics2->kind == ck_ambig @@ -7443,12 +7443,12 @@ is_subseq (conversion *ics1, conversion *ics2) sequences. */ return false; - ics2 = ics2->u.next; + ics2 = next_conversion (ics2); if (ics2->kind == ics1->kind && same_type_p (ics2->type, ics1->type) - && same_type_p (ics2->u.next->type, - ics1->u.next->type)) + && same_type_p (next_conversion (ics2)->type, + next_conversion (ics1)->type)) return true; } } @@ -7496,9 +7496,9 @@ maybe_handle_implicit_object (conversion **ics) reference_type = build_reference_type (reference_type); if (t->kind == ck_qual) - t = t->u.next; + t = next_conversion (t); if (t->kind == ck_ptr) - t = t->u.next; + t = next_conversion (t); t = build_identity_conv (TREE_TYPE (t->type), NULL_TREE); t = direct_reference_binding (reference_type, t); t->this_p = 1; @@ -7517,7 +7517,7 @@ maybe_handle_ref_bind (conversion **ics) if ((*ics)->kind == ck_ref_bind) { conversion *old_ics = *ics; - *ics = old_ics->u.next; + *ics = next_conversion (old_ics); (*ics)->user_conv_p = old_ics->user_conv_p; return old_ics; } @@ -7625,11 +7625,11 @@ compare_ics (conversion *ics1, conversion *ics2) conversion *t1; conversion *t2; - for (t1 = ics1; t1->kind != ck_user; t1 = t1->u.next) + for (t1 = ics1; t1->kind != ck_user; t1 = next_conversion (t1)) if (t1->kind == ck_ambig || t1->kind == ck_aggr || t1->kind == ck_list) break; - for (t2 = ics2; t2->kind != ck_user; t2 = t2->u.next) + for (t2 = ics2; t2->kind != ck_user; t2 = next_conversion (t2)) if (t2->kind == ck_ambig || t2->kind == ck_aggr || t2->kind == ck_list) break; @@ -7674,12 +7674,12 @@ compare_ics (conversion *ics1, conversion *ics2) t1 = ics1; while (t1->kind != ck_identity) - t1 = t1->u.next; + t1 = next_conversion (t1); from_type1 = t1->type; t2 = ics2; while (t2->kind != ck_identity) - t2 = t2->u.next; + t2 = next_conversion (t2); from_type2 = t2->type; } @@ -7941,7 +7941,7 @@ compare_ics (conversion *ics1, conversion *ics2) static tree source_type (conversion *t) { - for (;; t = t->u.next) + for (;; t = next_conversion (t)) { if (t->kind == ck_user || t->kind == ck_ambig @@ -8039,11 +8039,11 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn) && TREE_CODE (t2->type) == INTEGER_TYPE && (TYPE_PRECISION (t1->type) == TYPE_PRECISION (t2->type)) - && (TYPE_UNSIGNED (t1->u.next->type) - || (TREE_CODE (t1->u.next->type) + && (TYPE_UNSIGNED (next_conversion (t1)->type) + || (TREE_CODE (next_conversion (t1)->type) == ENUMERAL_TYPE))) { - tree type = t1->u.next->type; + tree type = next_conversion (t1)->type; tree type1, type2; struct z_candidate *w, *l; if (comp > 0) -- 1.7.6.5 -- Dodji