aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-06-22 22:33:12 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1995-06-22 22:33:12 -0400
commitc407792d6df76ceb007217935e003dd391e12b8a (patch)
treeb538526e14eebabcf7985aef85e61b47f95e5c3f /gcc
parent75b0bbced9115ced2175703e235ee4f6c1e777e3 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/init.c23
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. */