From: Jason Merrill Date: Thu, 27 Nov 1997 06:47:05 +0000 (+0000) Subject: rtti.c (build_dynamic_cast): Handle template case here. X-Git-Tag: releases/egcs-1.0.0~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=646a55305dbb611fa5da6aa3cf49136e40d211e2;p=thirdparty%2Fgcc.git rtti.c (build_dynamic_cast): Handle template case here. * rtti.c (build_dynamic_cast): Handle template case here. (build_dynamic_cast_1): Not here. * typeck2.c (digest_init): Make copies where appropriate. * decl2.c (delete_sanity): resolve_offset_ref. * except.c (expand_throw): Call mark_used on the destructor. From-SVN: r16777 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b376f2782bb2..c80089251a92 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -5,8 +5,18 @@ Wed Nov 26 20:28:49 1997 Jason Merrill + * rtti.c (build_dynamic_cast): Handle template case here. + (build_dynamic_cast_1): Not here. + + * typeck2.c (digest_init): Make copies where appropriate. + + * decl2.c (delete_sanity): resolve_offset_ref. + * except.c (expand_throw): Call mark_used on the destructor. + * except.c (expand_start_catch_block): Fix catching a reference + to pointer. + Tue Nov 25 11:28:21 1997 Jason Merrill * init.c (build_new): Copy size to the saveable obstack. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 5716af214d1e..4513f75df56e 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1242,7 +1242,10 @@ delete_sanity (exp, size, doing_vec, use_global_delete) return t; } - t = stabilize_reference (convert_from_reference (exp)); + t = exp; + if (TREE_CODE (t) == OFFSET_REF) + t = resolve_offset_ref (t); + t = stabilize_reference (convert_from_reference (t)); type = TREE_TYPE (t); code = TREE_CODE (type); diff --git a/gcc/cp/except.c b/gcc/cp/except.c index a18b70a6767f..91b1cdea7c6e 100644 --- a/gcc/cp/except.c +++ b/gcc/cp/except.c @@ -613,6 +613,13 @@ expand_start_catch_block (declspecs, declarator) init_type = build_reference_type (init_type); exp = get_eh_value (); + + /* Since pointers are passed by value, initialize a reference to + pointer catch parm with the address of the value slot. */ + if (TREE_CODE (init_type) == REFERENCE_TYPE + && TREE_CODE (TREE_TYPE (init_type)) == POINTER_TYPE) + exp = build_unary_op (ADDR_EXPR, exp, 1); + exp = expr_tree_cons (NULL_TREE, build_eh_type_type (TREE_TYPE (decl)), expr_tree_cons (NULL_TREE, diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index e7b83d37726a..494069627229 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -428,15 +428,6 @@ build_dynamic_cast_1 (type, expr) enum tree_code ec; tree dcast_fn; - if (type == error_mark_node || expr == error_mark_node) - return error_mark_node; - - if (processing_template_decl) - { - tree t = build_min (DYNAMIC_CAST_EXPR, type, expr); - return t; - } - assert (exprtype != NULL_TREE); ec = TREE_CODE (exprtype); @@ -647,6 +638,12 @@ tree build_dynamic_cast (type, expr) tree type, expr; { + if (type == error_mark_node || expr == error_mark_node) + return error_mark_node; + + if (processing_template_decl) + return build_min (DYNAMIC_CAST_EXPR, type, expr); + return convert_from_reference (build_dynamic_cast_1 (type, expr)); } diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index d876e76806f6..24e3c5cf08b6 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -743,6 +743,9 @@ digest_init (type, init, tail) init = DECL_INITIAL (init); else if (TREE_READONLY_DECL_P (init)) init = decl_constant_value (init); + else if (IS_AGGR_TYPE (type) && TYPE_NEEDS_CONSTRUCTING (type)) + init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP, + LOOKUP_NORMAL); return init; }