Commit 1998463c by Steven Bosscher

c-common.c (c_common_truthvalue_conversion): Warn if the address of a non-weak…

c-common.c (c_common_truthvalue_conversion): Warn if the address of a non-weak function is used as a truth value.

gcc/
	* c-common.c (c_common_truthvalue_conversion): Warn if the
	address of a non-weak function is used as a truth value.

cp/
	* cvt.c (ocp_convert): Move warning to C common code.

testsuite/
	* gcc.dg/weak/weak-3.c: Fix for new warning.

From-SVN: r72409
parent d60004ee
2003-10-12 Steven Bosscher <steven@gcc.gnu.org>
* c-common.c (c_common_truthvalue_conversion): Warn if the
address of a non-weak function is used as a truth value.
2003-10-12 Kazu Hirata <kazu@cs.umass.edu> 2003-10-12 Kazu Hirata <kazu@cs.umass.edu>
* config/h8300/h8300.c (WORD_REG_USED): Use SP_REG instead of * config/h8300/h8300.c (WORD_REG_USED): Use SP_REG instead of
......
...@@ -2602,6 +2602,9 @@ c_common_truthvalue_conversion (tree expr) ...@@ -2602,6 +2602,9 @@ c_common_truthvalue_conversion (tree expr)
if (TREE_CODE (expr) == ERROR_MARK) if (TREE_CODE (expr) == ERROR_MARK)
return expr; return expr;
if (TREE_CODE (expr) == FUNCTION_DECL)
expr = build_unary_op (ADDR_EXPR, expr, 0);
#if 0 /* This appears to be wrong for C++. */ #if 0 /* This appears to be wrong for C++. */
/* These really should return error_mark_node after 2.4 is stable. /* These really should return error_mark_node after 2.4 is stable.
But not all callers handle ERROR_MARK properly. */ But not all callers handle ERROR_MARK properly. */
...@@ -2647,17 +2650,29 @@ c_common_truthvalue_conversion (tree expr) ...@@ -2647,17 +2650,29 @@ c_common_truthvalue_conversion (tree expr)
return real_zerop (expr) ? truthvalue_false_node : truthvalue_true_node; return real_zerop (expr) ? truthvalue_false_node : truthvalue_true_node;
case ADDR_EXPR: case ADDR_EXPR:
/* If we are taking the address of an external decl, it might be zero {
if it is weak, so we cannot optimize. */ if (TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL
if (DECL_P (TREE_OPERAND (expr, 0)) && ! DECL_WEAK (TREE_OPERAND (expr, 0)))
&& DECL_EXTERNAL (TREE_OPERAND (expr, 0))) {
break; /* Common Ada/Pascal programmer's mistake. We always warn
about this since it is so bad. */
warning ("the address of `%D', will always evaluate as `true'",
TREE_OPERAND (expr, 0));
return truthvalue_true_node;
}
if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0))) /* If we are taking the address of an external decl, it might be
return build (COMPOUND_EXPR, truthvalue_type_node, zero if it is weak, so we cannot optimize. */
TREE_OPERAND (expr, 0), truthvalue_true_node); if (DECL_P (TREE_OPERAND (expr, 0))
else && DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
return truthvalue_true_node; break;
if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
return build (COMPOUND_EXPR, truthvalue_type_node,
TREE_OPERAND (expr, 0), truthvalue_true_node);
else
return truthvalue_true_node;
}
case COMPLEX_EXPR: case COMPLEX_EXPR:
return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)) return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
......
2003-10-12 Steven Bosscher <steven@gcc.gnu.org>
* cvt.c (ocp_convert): Move warning to C common code.
2003-10-09 Jason Merrill <jason@redhat.com> 2003-10-09 Jason Merrill <jason@redhat.com>
PR c++/6392 PR c++/6392
......
...@@ -694,20 +694,8 @@ ocp_convert (tree type, tree expr, int convtype, int flags) ...@@ -694,20 +694,8 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
return error_mark_node; return error_mark_node;
} }
if (code == BOOLEAN_TYPE) if (code == BOOLEAN_TYPE)
{ return cp_truthvalue_conversion (e);
tree fn = NULL_TREE;
/* Common Ada/Pascal programmer's mistake. We always warn
about this since it is so bad. */
if (TREE_CODE (expr) == FUNCTION_DECL)
fn = expr;
else if (TREE_CODE (expr) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL)
fn = TREE_OPERAND (expr, 0);
if (fn && !DECL_WEAK (fn))
warning ("the address of `%D', will always be `true'", fn);
return cp_truthvalue_conversion (e);
}
return fold (convert_to_integer (type, e)); return fold (convert_to_integer (type, e));
} }
if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type)) if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type))
......
2003-10-12 Steven Bosscher <steven@gcc.gnu.org>
* gcc.dg/weak/weak-3.c: Fix for new warning.
2003-10-12 Kelley Cook <kcook@gcc.gnu.org> 2003-10-12 Kelley Cook <kcook@gcc.gnu.org>
PR optimization/8750 PR optimization/8750
......
...@@ -54,7 +54,7 @@ extern void * ffoo1f (void); ...@@ -54,7 +54,7 @@ extern void * ffoo1f (void);
extern void * ffoox1f (void); extern void * ffoox1f (void);
void * foo1f (void) void * foo1f (void)
{ {
if (ffoo1f) if (ffoo1f) /* { dg-warning "" } */
ffoo1f (); ffoo1f ();
return 0; return 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