c-common.c (c_common_truthvalue_conversion): Warn if the address of a non-weak functi...
authorSteven Bosscher <steven@gcc.gnu.org>
Sun, 12 Oct 2003 22:09:29 +0000 (22:09 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Sun, 12 Oct 2003 22:09:29 +0000 (22:09 +0000)
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

gcc/ChangeLog
gcc/c-common.c
gcc/cp/ChangeLog
gcc/cp/cvt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/weak/weak-3.c

index be5de235254b1fe608952a5df6c5dbd0a8605bf8..052e74c196eb38e4aa930fe04624efa95e069133 100644 (file)
@@ -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
index b58eda14966d320b67231d5d3a5d59f7c9921a89..e8ed13b9363f7eb3ab4fcde1f556ebd9c2e3c7a0 100644 (file)
@@ -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))
index da318cfc9a215ec941182a75d221a010f873378f..9a0735bcca7cc373e8156cdf96e01bcf3190ff5d 100644 (file)
@@ -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
index 32d0d794cef80399a71ae45ce36ec24de259ad42..1479fbd69ebad6da1e8a68e6e4927195e6706c34 100644 (file)
@@ -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;
-
-         /* 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 cp_truthvalue_conversion (e);
+
       return fold (convert_to_integer (type, e));
     }
   if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type))
index 14e13efcb4abb91b597a3a9758983d510bbbbba2..84f7c92d5d979d5552ac7df6c5ca3da7c4dbf7b3 100644 (file)
@@ -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
index 338d9ad9db4a4d9078a1fe6ae082bbfe336531ff..da4367a71359b66824189a0e0c5682846159171a 100644 (file)
@@ -54,7 +54,7 @@ extern void * ffoo1f (void);
 extern void * ffoox1f (void);
 void * foo1f (void)
 {
-  if (ffoo1f)
+  if (ffoo1f) /* { dg-warning "" } */
     ffoo1f ();
   return 0;
 }