+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.
+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,
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
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))