mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-18 14:30:42 +08:00
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
This commit is contained in:
parent
d60004eecf
commit
1998463c54
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
* config/h8300/h8300.c (WORD_REG_USED): Use SP_REG instead of
|
||||
|
@ -2602,6 +2602,9 @@ c_common_truthvalue_conversion (tree expr)
|
||||
if (TREE_CODE (expr) == ERROR_MARK)
|
||||
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++. */
|
||||
/* These really should return error_mark_node after 2.4 is stable.
|
||||
But not all callers handle ERROR_MARK properly. */
|
||||
@ -2647,17 +2650,29 @@ c_common_truthvalue_conversion (tree expr)
|
||||
return real_zerop (expr) ? truthvalue_false_node : truthvalue_true_node;
|
||||
|
||||
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 (DECL_P (TREE_OPERAND (expr, 0))
|
||||
&& DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
|
||||
break;
|
||||
{
|
||||
if (TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL
|
||||
&& ! DECL_WEAK (TREE_OPERAND (expr, 0)))
|
||||
{
|
||||
/* 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)))
|
||||
return build (COMPOUND_EXPR, truthvalue_type_node,
|
||||
TREE_OPERAND (expr, 0), truthvalue_true_node);
|
||||
else
|
||||
return truthvalue_true_node;
|
||||
/* If we are taking the address of an external decl, it might be
|
||||
zero if it is weak, so we cannot optimize. */
|
||||
if (DECL_P (TREE_OPERAND (expr, 0))
|
||||
&& DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
|
||||
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:
|
||||
return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
|
||||
|
@ -1,3 +1,7 @@
|
||||
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>
|
||||
|
||||
PR c++/6392
|
||||
|
14
gcc/cp/cvt.c
14
gcc/cp/cvt.c
@ -694,20 +694,8 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
|
||||
return error_mark_node;
|
||||
}
|
||||
if (code == BOOLEAN_TYPE)
|
||||
{
|
||||
tree fn = NULL_TREE;
|
||||
return cp_truthvalue_conversion (e);
|
||||
|
||||
/* 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));
|
||||
}
|
||||
if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type))
|
||||
|
@ -1,3 +1,7 @@
|
||||
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>
|
||||
|
||||
PR optimization/8750
|
||||
|
@ -54,7 +54,7 @@ extern void * ffoo1f (void);
|
||||
extern void * ffoox1f (void);
|
||||
void * foo1f (void)
|
||||
{
|
||||
if (ffoo1f)
|
||||
if (ffoo1f) /* { dg-warning "" } */
|
||||
ffoo1f ();
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user