* pt.c (do_type_instantiation): Fix typo.
(mark_class_instantiated): If we support one_only but not weak
symbols, don't mark this as known.
* init.c (build_new): Handle cookies in EH cleanup.
Wed Nov 12 08:11:55 1997 Benjamin Kosnik <bkoz@rhino.cygnus.com>
* call.c (build_method_call): Call complete_type before checking
for destructor.
From-SVN: r16445
+Wed Nov 12 11:04:33 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * pt.c (do_type_instantiation): Fix typo.
+ (mark_class_instantiated): If we support one_only but not weak
+ symbols, don't mark this as known.
+
+ * init.c (build_new): Handle cookies in EH cleanup.
+
+Wed Nov 12 08:11:55 1997 Benjamin Kosnik <bkoz@rhino.cygnus.com>
+
+ * call.c (build_method_call): Call complete_type before checking
+ for destructor.
+
Wed Nov 12 00:48:16 1997 Jason Merrill <jason@yorick.cygnus.com>
* init.c (build_new): Handle freeing allocated memory when the
return cp_convert (void_type_node, instance);
}
- if (! TYPE_HAS_DESTRUCTOR (basetype))
+ if (! TYPE_HAS_DESTRUCTOR (complete_type (basetype)))
return cp_convert (void_type_node, instance);
instance = default_conversion (instance);
instance_ptr = build_unary_op (ADDR_EXPR, instance, 0);
{
tree cleanup;
+ if (use_cookie)
+ cleanup = build (MINUS_EXPR, TREE_TYPE (alloc_expr),
+ alloc_expr, BI_header_size);
+ else
+ cleanup = alloc_expr;
+
if (! use_global_new && TYPE_LANG_SPECIFIC (true_type)
&& (TYPE_GETS_DELETE (true_type) & (1 << has_array)))
- cleanup = build_opfncall (DELETE_EXPR, LOOKUP_NORMAL,
- alloc_expr, size, NULL_TREE);
+ cleanup = build_opfncall (has_array? VEC_DELETE_EXPR : DELETE_EXPR,
+ LOOKUP_NORMAL, cleanup, size, NULL_TREE);
else
cleanup = build_builtin_call
- (void_type_node, BID, build_expr_list (NULL_TREE, alloc_expr));
+ (void_type_node, has_array ? BIVD : BID,
+ build_expr_list (NULL_TREE, cleanup));
rval = build (TRY_CATCH_EXPR, TREE_TYPE (rval), rval, cleanup);
rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval);
{
DECL_INTERFACE_KNOWN (result) = 1;
DECL_NOT_REALLY_EXTERN (result) = 1;
+
+ /* For WIN32 we also want to put explicit instantiations in
+ linkonce sections. */
if (supports_one_only () && ! SUPPORTS_WEAK)
comdat_linkage (result);
}
int extern_p;
{
SET_CLASSTYPE_EXPLICIT_INSTANTIATION (t);
- SET_CLASSTYPE_INTERFACE_KNOWN (t);
- CLASSTYPE_INTERFACE_ONLY (t) = extern_p;
+
+ if (supports_one_only () && ! SUPPORTS_WEAK)
+ /* For WIN32 we also want to put explicit instantiations in
+ linkonce sections. */;
+ else
+ {
+ SET_CLASSTYPE_INTERFACE_KNOWN (t);
+ CLASSTYPE_INTERFACE_ONLY (t) = extern_p;
+ }
+
CLASSTYPE_VTABLE_NEEDS_WRITING (t) = ! extern_p;
TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = extern_p;
if (! extern_p)
if (! static_p)
for (tmp = TYPE_METHODS (t); tmp; tmp = TREE_CHAIN (tmp))
- if (TREE_CODE (t) == FUNCTION_DECL
+ if (TREE_CODE (tmp) == FUNCTION_DECL
&& DECL_TEMPLATE_INSTANTIATION (tmp))
{
mark_decl_instantiated (tmp, extern_p);