From d1b92730f38c5396f7f1c87b64a3d8579be78d73 Mon Sep 17 00:00:00 2001 From: paolo Date: Tue, 3 Feb 2004 11:22:41 +0000 Subject: 2004-02-03 Paolo Bonzini PR c/11658 PR c/13994 * Makefile.in (c-parse.o, c-convert.o, c-typeck.o): Depend on langhooks.h. * objc/Make-lang.in (objc-parse.o): Depend on langhooks.h. * c-parse.in, c-convert.c, c-typeck.c, objc/objc-act.c: Include langhooks.h. Replace c_common_truthvalue_conversion with the truthvalue_conversion language hook throughout. (expr_no_commas): Call default_conversion before save_expr for the first term of the production 'x ? : y'. * c-common.c (c_common_truthvalue_conversion): Remove obsolete block. Invoke recursively the hook instead of this function. * c-convert.c (convert): handle ERROR_MARK_NODE. * c-typeck.c (build_binary_op): handle ERROR_MARK_NODE returned by the truthvalue_conversion language hook. * c-lang.c (LANG_HOOKS_TRUTHVALUE_CONVERSION): Use c_objc_common_truthvalue_conversion. * c-objc-common.c (c_objc_common_truthvalue_conversion): New function. * c-tree.h (c_objc_common_truthvalue_conversion): Declare it. * objc/objc-lang.c (LANG_HOOKS_TRUTHVALUE_CONVERSION): Use c_objc_common_truthvalue_conversion. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77168 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c-common.c | 42 ++++++++++-------------------------------- 1 file changed, 10 insertions(+), 32 deletions(-) (limited to 'gcc/c-common.c') diff --git a/gcc/c-common.c b/gcc/c-common.c index b96655731eb..b628ac49e5b 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -2614,28 +2614,6 @@ c_common_truthvalue_conversion (tree expr) if (TREE_CODE (expr) == FUNCTION_DECL) expr = build_unary_op (ADDR_EXPR, expr, 0); -#if 0 /* This appears to be wrong for C++. */ - /* These really should return error_mark_node after 2.4 is stable. - But not all callers handle ERROR_MARK properly. */ - switch (TREE_CODE (TREE_TYPE (expr))) - { - case RECORD_TYPE: - error ("struct type value used where scalar is required"); - return truthvalue_false_node; - - case UNION_TYPE: - error ("union type value used where scalar is required"); - return truthvalue_false_node; - - case ARRAY_TYPE: - error ("array type value used where scalar is required"); - return truthvalue_false_node; - - default: - break; - } -#endif /* 0 */ - switch (TREE_CODE (expr)) { case EQ_EXPR: @@ -2686,15 +2664,15 @@ c_common_truthvalue_conversion (tree expr) case COMPLEX_EXPR: return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)) ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR), - c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)), - c_common_truthvalue_conversion (TREE_OPERAND (expr, 1)), + (*lang_hooks.truthvalue_conversion) (TREE_OPERAND (expr, 0)), + (*lang_hooks.truthvalue_conversion) (TREE_OPERAND (expr, 1)), 0); case NEGATE_EXPR: case ABS_EXPR: case FLOAT_EXPR: /* These don't change whether an object is nonzero or zero. */ - return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)); + return (*lang_hooks.truthvalue_conversion) (TREE_OPERAND (expr, 0)); case LROTATE_EXPR: case RROTATE_EXPR: @@ -2702,15 +2680,15 @@ c_common_truthvalue_conversion (tree expr) we can't ignore them if their second arg has side-effects. */ if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))) return build (COMPOUND_EXPR, truthvalue_type_node, TREE_OPERAND (expr, 1), - c_common_truthvalue_conversion (TREE_OPERAND (expr, 0))); + (*lang_hooks.truthvalue_conversion) (TREE_OPERAND (expr, 0))); else - return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)); + return (*lang_hooks.truthvalue_conversion) (TREE_OPERAND (expr, 0)); case COND_EXPR: /* Distribute the conversion into the arms of a COND_EXPR. */ return fold (build (COND_EXPR, truthvalue_type_node, TREE_OPERAND (expr, 0), - c_common_truthvalue_conversion (TREE_OPERAND (expr, 1)), - c_common_truthvalue_conversion (TREE_OPERAND (expr, 2)))); + (*lang_hooks.truthvalue_conversion) (TREE_OPERAND (expr, 1)), + (*lang_hooks.truthvalue_conversion) (TREE_OPERAND (expr, 2)))); case CONVERT_EXPR: /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE, @@ -2723,7 +2701,7 @@ c_common_truthvalue_conversion (tree expr) /* If this is widening the argument, we can ignore it. */ if (TYPE_PRECISION (TREE_TYPE (expr)) >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0)))) - return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)); + return (*lang_hooks.truthvalue_conversion) (TREE_OPERAND (expr, 0)); break; case MINUS_EXPR: @@ -2772,8 +2750,8 @@ c_common_truthvalue_conversion (tree expr) return (build_binary_op ((TREE_SIDE_EFFECTS (expr) ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR), - c_common_truthvalue_conversion (build_unary_op (REALPART_EXPR, t, 0)), - c_common_truthvalue_conversion (build_unary_op (IMAGPART_EXPR, t, 0)), + (*lang_hooks.truthvalue_conversion) (build_unary_op (REALPART_EXPR, t, 0)), + (*lang_hooks.truthvalue_conversion) (build_unary_op (IMAGPART_EXPR, t, 0)), 0)); } -- cgit v1.2.1