(build_conditional_expr): Use convert (boolean_type_node instead of truthvalue_conversion.

(build_conditional_expr): Use convert (boolean_type_node instead of
truthvalue_conversion.
(build_modify_expr): If the class lacks a constructor or assignment operator,
return error_mark_node.
(common_type): Use build_cplus_array_type.
(commonparms): Don't abort if simple_cst_equal returns < 0.
(build_c_cast): Don't tack on a NON_LVALUE_EXPR when casting to reference type.
(build_indirect_ref): Fix check for *&.

From-SVN: r10037
This commit is contained in:
Richard Kenner 1995-06-22 22:27:13 -04:00
parent dff6b454a2
commit 1743ca29c3

View File

@ -218,10 +218,7 @@ commonparms (p1, p2)
}
else
{
int cmp = simple_cst_equal (TREE_PURPOSE (p1), TREE_PURPOSE (p2));
if (cmp < 0)
my_friendly_abort (111);
if (cmp == 0)
if (1 != simple_cst_equal (TREE_PURPOSE (p1), TREE_PURPOSE (p2)))
any_change = 1;
TREE_PURPOSE (n) = TREE_PURPOSE (p2);
}
@ -419,7 +416,7 @@ common_type (t1, t2)
if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2))
return build_type_attribute_variant (t2, attributes);
/* Merge the element types, and have a size if either arg has one. */
t1 = build_array_type (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
t1 = build_cplus_array_type (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
return build_type_attribute_variant (t1, attributes);
}
@ -1858,8 +1855,12 @@ build_indirect_ref (ptr, errorstring)
if (TREE_CODE (type) == POINTER_TYPE || TREE_CODE (type) == REFERENCE_TYPE)
{
if (TREE_CODE (pointer) == ADDR_EXPR
&& (TREE_TYPE (TREE_OPERAND (pointer, 0))
== TREE_TYPE (type)))
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (pointer, 0)))
== TYPE_MAIN_VARIANT (TREE_TYPE (type)))
&& (TREE_READONLY (TREE_OPERAND (pointer, 0))
== TYPE_READONLY (TREE_TYPE (type)))
&& (TREE_THIS_VOLATILE (TREE_OPERAND (pointer, 0))
== TYPE_VOLATILE (TREE_TYPE (type))))
return TREE_OPERAND (pointer, 0);
else
{
@ -4559,7 +4560,7 @@ build_conditional_expr (ifexp, op1, op2)
ifexp = op1 = save_expr (ifexp);
}
ifexp = truthvalue_conversion (ifexp);
ifexp = convert (boolean_type_node, ifexp);
if (TREE_CODE (ifexp) == ERROR_MARK)
return error_mark_node;
@ -5233,11 +5234,12 @@ build_c_cast (type, expr, allow_nonconverting)
so we can tell (for -pedantic) that the cast is no lvalue.
Also, pedantically, don't let (void *) (FOO *) 0 be a null
pointer constant. */
if (value == expr
|| (pedantic
&& TREE_CODE (value) == INTEGER_CST
&& TREE_CODE (expr) == INTEGER_CST
&& TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE))
if (TREE_CODE (type) != REFERENCE_TYPE
&& (value == expr
|| (pedantic
&& TREE_CODE (value) == INTEGER_CST
&& TREE_CODE (expr) == INTEGER_CST
&& TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE)))
value = non_lvalue (value);
return value;
@ -5670,7 +5672,10 @@ build_modify_expr (lhs, modifycode, rhs)
if (! IS_AGGR_TYPE (lhstype))
/* Do the default thing */;
else if (! TYPE_HAS_CONSTRUCTOR (lhstype))
cp_error ("`%T' has no constructors", lhstype);
{
cp_error ("`%T' has no constructors", lhstype);
return error_mark_node;
}
else if (TYPE_HAS_TRIVIAL_INIT_REF (lhstype)
&& TYPE_MAIN_VARIANT (lhstype) == TYPE_MAIN_VARIANT (TREE_TYPE (newrhs)))
/* Do the default thing */;
@ -5691,7 +5696,10 @@ build_modify_expr (lhs, modifycode, rhs)
if (! IS_AGGR_TYPE (lhstype))
/* Do the default thing */;
else if (! TYPE_HAS_ASSIGNMENT (lhstype))
cp_error ("`%T' does not define operator=", lhstype);
{
cp_error ("`%T' does not define operator=", lhstype);
return error_mark_node;
}
else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (lhstype)
&& TYPE_MAIN_VARIANT (lhstype) == TYPE_MAIN_VARIANT (TREE_TYPE (newrhs)))
{