clone = copy_fndecl_with_name (fn, name, ERROR_MARK,
need_vtt_parm_p, omit_inherited_parms_p);
DECL_CLONED_FUNCTION (clone) = fn;
+
+ maybe_prepare_return_this (clone);
}
/* Remember where this function came from. */
extern bool start_preparsed_function (tree, tree, int);
extern bool start_function (cp_decl_specifier_seq *,
const cp_declarator *, tree);
+extern tree maybe_prepare_return_this (tree);
extern void maybe_return_this (void);
extern tree begin_function_body (void);
extern void finish_function_body (tree);
}
\f
+/* Mark CDTOR's implicit THIS argument for returning, if required by
+ the ABI.. Return the decl for THIS, if it is to be returned, and
+ NULL otherwise. */
+
+tree
+maybe_prepare_return_this (tree cdtor)
+{
+ if (targetm.cxx.cdtor_returns_this ())
+ if (tree val = DECL_ARGUMENTS (cdtor))
+ {
+ suppress_warning (val, OPT_Wuse_after_free);
+ return val;
+ }
+
+ return NULL_TREE;
+}
+
/* Set the return value of the [cd]tor if the ABI wants that. */
void
-maybe_return_this (void)
+maybe_return_this ()
{
- if (targetm.cxx.cdtor_returns_this ())
+ if (tree val = maybe_prepare_return_this (current_function_decl))
{
/* Return the address of the object. */
- tree val = DECL_ARGUMENTS (current_function_decl);
- suppress_warning (val, OPT_Wuse_after_free);
val = fold_convert (TREE_TYPE (DECL_RESULT (current_function_decl)), val);
val = build2 (MODIFY_EXPR, TREE_TYPE (val),
DECL_RESULT (current_function_decl), val);
A::~A ()
{
operator delete (this);
- f (); // { dg-warning "used after" }
+ f (); // { dg-warning "used after" "" { xfail arm_eabi } }
+ // arm_eabi's cdtors return this, which disables -Wuse-after-free
+ // warnings for cdtors' "this".
}