diff options
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/class.c | 21 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/rtti.c | 24 |
3 files changed, 20 insertions, 26 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c index ea007e88e6e..856e81e3d1a 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -402,16 +402,9 @@ build_base_path (enum tree_code code, if (TREE_SIDE_EFFECTS (expr) && (null_test || virtual_access)) expr = save_expr (expr); - /* Now that we've saved expr, build the real null test. */ + /* Store EXPR and build the real null test just before returning. */ if (null_test) - { - tree zero = cp_convert (TREE_TYPE (expr), nullptr_node, complain); - null_test = build2_loc (input_location, NE_EXPR, boolean_type_node, - expr, zero); - /* This is a compiler generated comparison, don't emit - e.g. -Wnonnull-compare warning for it. */ - TREE_NO_WARNING (null_test) = 1; - } + null_test = expr; /* If this is a simple base reference, express it as a COMPONENT_REF. */ if (code == PLUS_EXPR && !virtual_access @@ -516,14 +509,8 @@ build_base_path (enum tree_code code, out: if (null_test) - { - expr = fold_build3_loc (input_location, COND_EXPR, target_type, null_test, - expr, build_zero_cst (target_type)); - /* Avoid warning for the whole conditional expression (in addition - to NULL_TEST itself -- see above) in case the result is used in - a nonnull context that the front end -Wnonnull checks. */ - TREE_NO_WARNING (expr) = 1; - } + /* Wrap EXPR in a null test. */ + expr = build_if_nonnull (null_test, expr, complain); return expr; } diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 544e99538a4..b4728c87d0b 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7279,6 +7279,7 @@ extern void emit_support_tinfos (void); extern bool emit_tinfo_decl (tree); extern unsigned get_pseudo_tinfo_index (tree); extern tree get_pseudo_tinfo_type (unsigned); +extern tree build_if_nonnull (tree, tree, tsubst_flags_t); /* in search.c */ extern tree get_parent_with_private_access (tree decl, tree binfo); diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index b41d95469c6..5a33b83afd0 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -121,7 +121,6 @@ vec<tree, va_gc> *unemitted_tinfo_decls; and are generated as needed. */ static GTY (()) vec<tinfo_s, va_gc> *tinfo_descs; -static tree ifnonnull (tree, tree, tsubst_flags_t); static tree tinfo_name (tree, bool); static tree build_dynamic_cast_1 (location_t, tree, tree, tsubst_flags_t); static tree throw_bad_cast (void); @@ -529,16 +528,23 @@ get_typeid (tree type, tsubst_flags_t complain) /* Check whether TEST is null before returning RESULT. If TEST is used in RESULT, it must have previously had a save_expr applied to it. */ -static tree -ifnonnull (tree test, tree result, tsubst_flags_t complain) +tree +build_if_nonnull (tree test, tree result, tsubst_flags_t complain) { - tree cond = build2 (NE_EXPR, boolean_type_node, test, - cp_convert (TREE_TYPE (test), nullptr_node, complain)); + tree null_ptr = cp_convert (TREE_TYPE (test), nullptr_node, complain); + tree cond = build2 (NE_EXPR, boolean_type_node, test, null_ptr); + /* This is a compiler generated comparison, don't emit e.g. -Wnonnull-compare warning for it. */ TREE_NO_WARNING (cond) = 1; - return build3 (COND_EXPR, TREE_TYPE (result), cond, result, - cp_convert (TREE_TYPE (result), nullptr_node, complain)); + + null_ptr = cp_convert (TREE_TYPE (result), nullptr_node, complain); + cond = build3 (COND_EXPR, TREE_TYPE (result), cond, result, null_ptr); + + /* Likewise, don't emit -Wnonnull for using the result to call + a member function. */ + TREE_NO_WARNING (cond) = 1; + return cond; } /* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working @@ -671,7 +677,7 @@ build_dynamic_cast_1 (location_t loc, tree type, tree expr, expr1 = build_headof (expr); if (TREE_TYPE (expr1) != type) expr1 = build1 (NOP_EXPR, type, expr1); - return ifnonnull (expr, expr1, complain); + return build_if_nonnull (expr, expr1, complain); } else { @@ -786,7 +792,7 @@ build_dynamic_cast_1 (location_t loc, tree type, tree expr, /* Now back to the type we want from a void*. */ result = cp_convert (type, result, complain); - return ifnonnull (expr, result, complain); + return build_if_nonnull (expr, result, complain); } } else |