------- Comment #9 from pinskia at gcc dot gnu dot org  2006-01-24 16:16 -------
The full patch (with some cleanup) is:
Index: c-common.c
===================================================================
--- c-common.c  (revision 110173)
+++ c-common.c  (working copy)
@@ -2456,25 +2456,26 @@ c_common_truthvalue_conversion (tree exp

     case ADDR_EXPR:
       {
-       if (DECL_P (TREE_OPERAND (expr, 0))
-           && !DECL_WEAK (TREE_OPERAND (expr, 0)))
+       tree inner = TREE_OPERAND (expr, 0);
+       if (DECL_P (inner)
+           && (TREE_CODE (inner) == PARM_DECL || !DECL_WEAK (inner)))
          {
            /* Common Ada/Pascal programmer's mistake.  We always warn
               about this since it is so bad.  */
            warning (OPT_Walways_true, "the address of %qD, will always
evaluate as %<true%>",
-                    TREE_OPERAND (expr, 0));
+                    inner);
            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)))
+       if (DECL_P (inner)
+           && DECL_EXTERNAL (inner))
          break;

-       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
+       if (TREE_SIDE_EFFECTS (inner))
          return build2 (COMPOUND_EXPR, truthvalue_type_node,
-                        TREE_OPERAND (expr, 0), truthvalue_true_node);
+                        inner, truthvalue_true_node);
        else
          return truthvalue_true_node;
       }


I am testing this right now.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25861

Reply via email to