diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1995-06-22 22:33:12 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1995-06-22 22:33:12 -0400 |
commit | c407792d6df76ceb007217935e003dd391e12b8a (patch) | |
tree | b538526e14eebabcf7985aef85e61b47f95e5c3f | |
parent | 75b0bbced9115ced2175703e235ee4f6c1e777e3 (diff) | |
download | gcc-c407792d6df76ceb007217935e003dd391e12b8a.zip gcc-c407792d6df76ceb007217935e003dd391e12b8a.tar.gz gcc-c407792d6df76ceb007217935e003dd391e12b8a.tar.bz2 |
(build_delete): If the TYPE_DOMAIN is not set, give an error instead of core dumping.
(build_delete): If the TYPE_DOMAIN is not set, give an error instead
of core dumping.
(build_vec_delete): Resolve an offset ref before we try to use it.
(member_init_ok_or_else): Don't allow initialization of an ancestor's member
from within a constructor.
From-SVN: r10042
-rw-r--r-- | gcc/cp/init.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c index d131759..137c612 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -840,8 +840,12 @@ member_init_ok_or_else (field, type, member_name) if (DECL_CONTEXT (field) != type && TYPE_NEEDS_CONSTRUCTING (DECL_CONTEXT (field))) { - cp_error ("member `%D' comes from base class needing constructor", - field); + if (current_function_decl && DECL_CONSTRUCTOR_P (current_function_decl)) + cp_error ("initialization of `%D' inside constructor for `%T'", + field, type); + else + cp_error ("member `%D' comes from base class needing constructor", + field); return 0; } if (TREE_STATIC (field)) @@ -3592,6 +3596,11 @@ build_delete (type, addr, auto_delete, flags, use_global_delete) handle_array: if (TREE_SIDE_EFFECTS (addr)) addr = save_expr (addr); + if (TYPE_DOMAIN (type) == NULL_TREE) + { + error ("unknown array size in delete"); + return error_mark_node; + } return build_vec_delete (addr, array_type_nelts (type), c_sizeof_nowarn (TREE_TYPE (type)), auto_delete, integer_two_node, @@ -3932,9 +3941,8 @@ build_vec_delete (base, maxindex, elt_size, auto_delete_vec, auto_delete, tree auto_delete_vec, auto_delete; int use_global_delete; { - tree ptype = TREE_TYPE (base); - tree type; - tree virtual_size; + tree ptype, type, virtual_size; + /* Temporary variables used by the loop. */ tree tbase, size_exp, tbase_init; @@ -3957,6 +3965,11 @@ build_vec_delete (base, maxindex, elt_size, auto_delete_vec, auto_delete, /* This is the BLOCK to record the symbol binding for debugging. */ tree block; + if (TREE_CODE (base) == OFFSET_REF) + base = resolve_offset_ref (base); + + ptype = TREE_TYPE (base); + base = stabilize_reference (base); /* Since we can use base many times, save_expr it. */ |