From 88f1975682abfbb86e5e2807ef7225fe6ce177fc Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 30 Aug 2004 11:16:31 -0700 Subject: [PATCH] fold-const.c (tree_expr_nonzero_p): Use get_base_address before assuming an ADDR_EXPR is non-null. * 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 | 5 +++++ gcc/cp/ChangeLog | 5 +++++ gcc/cp/class.c | 12 ++++++++++-- gcc/fold-const.c | 21 ++++++++++++++++----- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 755b8016b1b..6320873a49d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-08-30 Richard Henderson + + * fold-const.c (tree_expr_nonzero_p): Use get_base_address before + assuming an ADDR_EXPR is non-null. + 2004-08-30 Jason Merrill * gthr-posix.h, gthr-dce.h: Add #pragma weaks. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c589b3418a7..83e38c94df1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2004-08-30 Richard Henderson + + * class.c (fixed_type_or_null): Use get_base_address before + assuming an ADDR_EXPR is non-null. + 2004-08-30 Nathan Sidwell * name-lookup.c (pop_binding, pushdecl, diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 22781e3c331..9ef15dcca98 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index f728db60edc..3ee2bc746e3 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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)) -- 2.30.2