diff options
author | Jason Merrill <jason@gcc.gnu.org> | 2002-10-15 18:03:53 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2002-10-15 18:03:53 -0400 |
commit | 1a55127d2253848d525bb62ff95bd70fc65a5d2f (patch) | |
tree | dfafa4d339e98f37653c6a692f593667acd86132 /gcc | |
parent | 74f6d07186e73e97aa4779ec7c996fef36a8011b (diff) | |
download | gcc-1a55127d2253848d525bb62ff95bd70fc65a5d2f.zip gcc-1a55127d2253848d525bb62ff95bd70fc65a5d2f.tar.gz gcc-1a55127d2253848d525bb62ff95bd70fc65a5d2f.tar.bz2 |
call.c (call_builtin_trap): New fn.
* 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.
From-SVN: r58180
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/call.c | 26 |
2 files changed, 30 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9087df7..211f275 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2002-10-15 Jason Merrill <jason@redhat.com> + + * 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 <mark@codesourcery.com> * 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 1947076..1b79ac4 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; |