* 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
Wed Nov 26 20:28:49 1997 Jason Merrill <jason@yorick.cygnus.com>
+ * 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 <jason@yorick.cygnus.com>
* init.c (build_new): Copy size to the saveable obstack.
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);
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,
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);
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));
}
\f
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;
}