From 8bcaac0569dfb4c7129a228e0678140a8daab189 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 15 Oct 2002 22:03:53 +0000 Subject: [PATCH] * call.c (call_builtin_trap): New fn. (convert_arg_to_ellipsis): Use it. Downgrade error to warning. (build_call): Don't set current_function_returns_abnormally outside a function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58180 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 9 ++++++++- gcc/cp/call.c | 26 ++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9087df7fe42..211f275e586 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2002-10-15 Jason Merrill + + * call.c (call_builtin_trap): New fn. + (convert_arg_to_ellipsis): Use it. Downgrade error to warning. + (build_call): Don't set current_function_returns_abnormally outside + a function. + 2002-10-14 Mark Mitchell * class.c (check_field_decls): Remove empty_p parameter. Instead, @@ -2651,7 +2658,7 @@ * pt.c (convert_template_argument): Adjust make_typename_type return value. (tsubst): Adjust cp_build_qualified_type_real calls. - (check_cv_quals_for_unify): Cope with alowing bad qualifications + (check_cv_quals_for_unify): Cope with allowing bad qualifications on template type parms. (instantiate_decl): Recheck substitutions to give warnings on bad qualifications. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 194707666a4..1b79ac48250 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -101,6 +101,7 @@ static tree convert_class_to_reference PARAMS ((tree, tree, tree)); static tree direct_reference_binding PARAMS ((tree, tree)); static int promoted_arithmetic_type_p PARAMS ((tree)); static tree conditional_conversion PARAMS ((tree, tree)); +static tree call_builtin_trap PARAMS ((void)); tree build_vfield_ref (datum, type) @@ -380,7 +381,7 @@ build_call (function, parms) nothrow = ((decl && TREE_NOTHROW (decl)) || TYPE_NOTHROW_P (TREE_TYPE (TREE_TYPE (function)))); - if (decl && TREE_THIS_VOLATILE (decl)) + if (decl && TREE_THIS_VOLATILE (decl) && cfun) current_function_returns_abnormally = 1; if (decl && TREE_DEPRECATED (decl)) @@ -4097,6 +4098,22 @@ convert_like_real (convs, expr, fn, argnum, inner) LOOKUP_NORMAL|LOOKUP_NO_CONVERSION); } +/* Build a call to __builtin_trap which can be used in an expression. */ + +static tree +call_builtin_trap () +{ + tree fn = get_identifier ("__builtin_trap"); + if (IDENTIFIER_GLOBAL_VALUE (fn)) + fn = IDENTIFIER_GLOBAL_VALUE (fn); + else + abort (); + + fn = build_call (fn, NULL_TREE); + fn = build (COMPOUND_EXPR, integer_type_node, fn, integer_zero_node); + return fn; +} + /* ARG is being passed to a varargs function. Perform any conversions required. Array/function to pointer decay must have already happened. Return the converted value. */ @@ -4121,9 +4138,10 @@ convert_arg_to_ellipsis (arg) /* Undefined behavior [expr.call] 5.2.2/7. We used to just warn here and do a bitwise copy, but now cp_expr_size will abort if we try to do that. */ - error ("cannot pass objects of non-POD type `%#T' through `...'", - TREE_TYPE (arg)); - arg = error_mark_node; + warning ("cannot pass objects of non-POD type `%#T' through `...'; \ +call will abort at runtime", + TREE_TYPE (arg)); + arg = call_builtin_trap (); } return arg; -- 2.11.0