Commit 40703fdf by Dodji Seketeli Committed by Dodji Seketeli

Use next_conversion for better safety

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.

From-SVN: r185356
parent 9243c51d
2011-12-15 Dodji Seketeli <dodji@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.carlini@oracle.com> 2012-03-12 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/52299 PR c++/52299
......
...@@ -1325,7 +1325,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, ...@@ -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. */ /* Give this a better rank if it's a promotion. */
if (same_type_p (to, type_promotes_to (from)) 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; conv->rank = cr_promotion;
} }
else if (fcode == VECTOR_TYPE && tcode == VECTOR_TYPE else if (fcode == VECTOR_TYPE && tcode == VECTOR_TYPE
...@@ -1335,7 +1335,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, ...@@ -1335,7 +1335,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
&& is_properly_derived_from (from, to)) && is_properly_derived_from (from, to))
{ {
if (conv->kind == ck_rvalue) if (conv->kind == ck_rvalue)
conv = conv->u.next; conv = next_conversion (conv);
conv = build_conv (ck_base, to, conv); conv = build_conv (ck_base, to, conv);
/* The derived-to-base conversion indicates the initialization /* The derived-to-base conversion indicates the initialization
of a parameter with base type from an object of a derived 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) ...@@ -3697,7 +3697,7 @@ build_integral_nontype_arg_conv (tree type, tree expr, tsubst_flags_t complain)
break; break;
case ck_std: case ck_std:
t = conv->u.next->type; t = next_conversion (conv)->type;
if (INTEGRAL_OR_ENUMERATION_TYPE_P (t)) if (INTEGRAL_OR_ENUMERATION_TYPE_P (t))
break; break;
...@@ -5145,7 +5145,7 @@ build_new_op_1 (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, ...@@ -5145,7 +5145,7 @@ build_new_op_1 (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
objects directly. */ objects directly. */
conv = cand->convs[0]; conv = cand->convs[0];
if (conv->kind == ck_ref_bind) if (conv->kind == ck_ref_bind)
conv = conv->u.next; conv = next_conversion (conv);
arg1 = convert_like (conv, arg1, complain); arg1 = convert_like (conv, arg1, complain);
if (arg2) if (arg2)
...@@ -5159,14 +5159,14 @@ build_new_op_1 (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, ...@@ -5159,14 +5159,14 @@ build_new_op_1 (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
conv = cand->convs[1]; conv = cand->convs[1];
if (conv->kind == ck_ref_bind) if (conv->kind == ck_ref_bind)
conv = conv->u.next; conv = next_conversion (conv);
arg2 = convert_like (conv, arg2, complain); arg2 = convert_like (conv, arg2, complain);
} }
if (arg3) if (arg3)
{ {
conv = cand->convs[2]; conv = cand->convs[2];
if (conv->kind == ck_ref_bind) if (conv->kind == ck_ref_bind)
conv = conv->u.next; conv = next_conversion (conv);
arg3 = convert_like (conv, arg3, complain); arg3 = convert_like (conv, arg3, complain);
} }
...@@ -5806,7 +5806,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, ...@@ -5806,7 +5806,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
break; 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 ? -1 : 1,
convs->kind == ck_ref_bind ? issue_conversion_warnings : false, convs->kind == ck_ref_bind ? issue_conversion_warnings : false,
c_cast_p, c_cast_p,
...@@ -5859,7 +5859,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, ...@@ -5859,7 +5859,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
{ {
tree ref_type = totype; 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) gcc_assert (TYPE_REF_IS_RVALUE (ref_type)
&& real_lvalue_p (expr)); && real_lvalue_p (expr));
...@@ -5889,7 +5889,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, ...@@ -5889,7 +5889,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
cp_lvalue_kind lvalue = real_lvalue_p (expr); cp_lvalue_kind lvalue = real_lvalue_p (expr);
gcc_assert (same_type_ignoring_top_level_qualifiers_p 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) if (!CP_TYPE_CONST_NON_VOLATILE_P (type)
&& !TYPE_REF_IS_RVALUE (ref_type)) && !TYPE_REF_IS_RVALUE (ref_type))
{ {
...@@ -7424,13 +7424,13 @@ is_subseq (conversion *ics1, conversion *ics2) ...@@ -7424,13 +7424,13 @@ is_subseq (conversion *ics1, conversion *ics2)
while (ics1->kind == ck_rvalue while (ics1->kind == ck_rvalue
|| ics1->kind == ck_lvalue) || ics1->kind == ck_lvalue)
ics1 = ics1->u.next; ics1 = next_conversion (ics1);
while (1) while (1)
{ {
while (ics2->kind == ck_rvalue while (ics2->kind == ck_rvalue
|| ics2->kind == ck_lvalue) || ics2->kind == ck_lvalue)
ics2 = ics2->u.next; ics2 = next_conversion (ics2);
if (ics2->kind == ck_user if (ics2->kind == ck_user
|| ics2->kind == ck_ambig || ics2->kind == ck_ambig
...@@ -7443,12 +7443,12 @@ is_subseq (conversion *ics1, conversion *ics2) ...@@ -7443,12 +7443,12 @@ is_subseq (conversion *ics1, conversion *ics2)
sequences. */ sequences. */
return false; return false;
ics2 = ics2->u.next; ics2 = next_conversion (ics2);
if (ics2->kind == ics1->kind if (ics2->kind == ics1->kind
&& same_type_p (ics2->type, ics1->type) && same_type_p (ics2->type, ics1->type)
&& same_type_p (ics2->u.next->type, && same_type_p (next_conversion (ics2)->type,
ics1->u.next->type)) next_conversion (ics1)->type))
return true; return true;
} }
} }
...@@ -7496,9 +7496,9 @@ maybe_handle_implicit_object (conversion **ics) ...@@ -7496,9 +7496,9 @@ maybe_handle_implicit_object (conversion **ics)
reference_type = build_reference_type (reference_type); reference_type = build_reference_type (reference_type);
if (t->kind == ck_qual) if (t->kind == ck_qual)
t = t->u.next; t = next_conversion (t);
if (t->kind == ck_ptr) if (t->kind == ck_ptr)
t = t->u.next; t = next_conversion (t);
t = build_identity_conv (TREE_TYPE (t->type), NULL_TREE); t = build_identity_conv (TREE_TYPE (t->type), NULL_TREE);
t = direct_reference_binding (reference_type, t); t = direct_reference_binding (reference_type, t);
t->this_p = 1; t->this_p = 1;
...@@ -7517,7 +7517,7 @@ maybe_handle_ref_bind (conversion **ics) ...@@ -7517,7 +7517,7 @@ maybe_handle_ref_bind (conversion **ics)
if ((*ics)->kind == ck_ref_bind) if ((*ics)->kind == ck_ref_bind)
{ {
conversion *old_ics = *ics; conversion *old_ics = *ics;
*ics = old_ics->u.next; *ics = next_conversion (old_ics);
(*ics)->user_conv_p = old_ics->user_conv_p; (*ics)->user_conv_p = old_ics->user_conv_p;
return old_ics; return old_ics;
} }
...@@ -7625,11 +7625,11 @@ compare_ics (conversion *ics1, conversion *ics2) ...@@ -7625,11 +7625,11 @@ compare_ics (conversion *ics1, conversion *ics2)
conversion *t1; conversion *t1;
conversion *t2; 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 if (t1->kind == ck_ambig || t1->kind == ck_aggr
|| t1->kind == ck_list) || t1->kind == ck_list)
break; 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 if (t2->kind == ck_ambig || t2->kind == ck_aggr
|| t2->kind == ck_list) || t2->kind == ck_list)
break; break;
...@@ -7674,12 +7674,12 @@ compare_ics (conversion *ics1, conversion *ics2) ...@@ -7674,12 +7674,12 @@ compare_ics (conversion *ics1, conversion *ics2)
t1 = ics1; t1 = ics1;
while (t1->kind != ck_identity) while (t1->kind != ck_identity)
t1 = t1->u.next; t1 = next_conversion (t1);
from_type1 = t1->type; from_type1 = t1->type;
t2 = ics2; t2 = ics2;
while (t2->kind != ck_identity) while (t2->kind != ck_identity)
t2 = t2->u.next; t2 = next_conversion (t2);
from_type2 = t2->type; from_type2 = t2->type;
} }
...@@ -7941,7 +7941,7 @@ compare_ics (conversion *ics1, conversion *ics2) ...@@ -7941,7 +7941,7 @@ compare_ics (conversion *ics1, conversion *ics2)
static tree static tree
source_type (conversion *t) source_type (conversion *t)
{ {
for (;; t = t->u.next) for (;; t = next_conversion (t))
{ {
if (t->kind == ck_user if (t->kind == ck_user
|| t->kind == ck_ambig || t->kind == ck_ambig
...@@ -8039,11 +8039,11 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn) ...@@ -8039,11 +8039,11 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
&& TREE_CODE (t2->type) == INTEGER_TYPE && TREE_CODE (t2->type) == INTEGER_TYPE
&& (TYPE_PRECISION (t1->type) && (TYPE_PRECISION (t1->type)
== TYPE_PRECISION (t2->type)) == TYPE_PRECISION (t2->type))
&& (TYPE_UNSIGNED (t1->u.next->type) && (TYPE_UNSIGNED (next_conversion (t1)->type)
|| (TREE_CODE (t1->u.next->type) || (TREE_CODE (next_conversion (t1)->type)
== ENUMERAL_TYPE))) == ENUMERAL_TYPE)))
{ {
tree type = t1->u.next->type; tree type = next_conversion (t1)->type;
tree type1, type2; tree type1, type2;
struct z_candidate *w, *l; struct z_candidate *w, *l;
if (comp > 0) if (comp > 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment