fold-const.c (tree_expr_nonzero_p): Use get_base_address before assuming an ADDR_EXPR...
authorRichard Henderson <rth@redhat.com>
Mon, 30 Aug 2004 18:16:31 +0000 (11:16 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 30 Aug 2004 18:16:31 +0000 (11:16 -0700)
        * fold-const.c (tree_expr_nonzero_p): Use get_base_address before
        assuming an ADDR_EXPR is non-null.
cp/
        * class.c (fixed_type_or_null): Use get_base_address before
        assuming an ADDR_EXPR is non-null.

From-SVN: r86788

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/fold-const.c

index 755b8016b1b8cf0a743c7f5560919a1bc81ecaea..6320873a49d5f21b9f94a6262c23c7935c4f934f 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-30  Richard Henderson  <rth@redhat.com>
+
+       * fold-const.c (tree_expr_nonzero_p): Use get_base_address before
+       assuming an ADDR_EXPR is non-null.
+
 2004-08-30  Jason Merrill  <jason@redhat.com>
 
        * gthr-posix.h, gthr-dce.h: Add #pragma weaks.
index c589b3418a70a9b57ae52404b36c2a9848bedf55..83e38c94df143f87747f38186c9f563723417e80 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-30  Richard Henderson  <rth@redhat.com>
+
+       * class.c (fixed_type_or_null): Use get_base_address before
+       assuming an ADDR_EXPR is non-null.
+
 2004-08-30  Nathan Sidwell  <nathan@codesourcery.com>
 
        * name-lookup.c (pop_binding, pushdecl,
index 22781e3c331e2da5cd26427a9af029ee17ff063c..9ef15dcca9808efb5e1496a2c57a79cb8cd43705 100644 (file)
@@ -5238,9 +5238,17 @@ fixed_type_or_null (tree instance, int* nonnull, int* cdtorp)
       return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull, cdtorp);
 
     case ADDR_EXPR:
+      instance = TREE_OPERAND (instance, 0);
       if (nonnull)
-       *nonnull = 1;
-      return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull, cdtorp);
+       {
+         /* Just because we see an ADDR_EXPR doesn't mean we're dealing
+            with a real object -- given &p->f, p can still be null.  */
+         tree t = get_base_address (instance);
+         /* ??? Probably should check DECL_WEAK here.  */
+         if (t && DECL_P (t))
+           *nonnull = 1;
+       }
+      return fixed_type_or_null (instance, nonnull, cdtorp);
 
     case COMPONENT_REF:
       /* If this component is really a base class reference, then the field
index f728db60edc3fc815d4297651e86a7ed254b146e..3ee2bc746e3db1daf69916ea9d21ff4653cf8c57 100644 (file)
@@ -9582,11 +9582,22 @@ tree_expr_nonzero_p (tree t)
       break;
 
    case ADDR_EXPR:
-      /* Weak declarations may link to NULL.  */
-      if (DECL_P (TREE_OPERAND (t, 0)))
-       return !DECL_WEAK (TREE_OPERAND (t, 0));
-      /* Constants and all other cases are never weak.  */
-      return true;
+      {
+       tree base = get_base_address (TREE_OPERAND (t, 0));
+
+       if (!base)
+         return false;
+
+       /* Weak declarations may link to NULL.  */
+       if (DECL_P (base))
+         return !DECL_WEAK (base);
+
+       /* Constants are never weak.  */
+       if (TREE_CODE_CLASS (TREE_CODE (base)) == 'c')
+         return true;
+
+       return false;
+      }
 
     case COND_EXPR:
       return (tree_expr_nonzero_p (TREE_OPERAND (t, 1))