builtins.c (expand_builtin_va_arg): Give warnings not errors for promoted argument types; build trap.

* builtins.c (expand_builtin_va_arg): Give warnings not errors for
        promoted argument types; build trap.
        (expand_builtin_trap): New.
        (expand_builtin): Use it.
        * stmt.c (expand_nl_goto_receivers): Likewise.
        * expr.h (expand_builtin_trap): Declare.
        * libfuncs.h (LTI_abort, abort_libfunc): New.
        * optabs.c (init_optabs): Init abort_libfunc.

        * gcc.dg/va-arg-1.c: Expect warnings, not errors.

From-SVN: r51641
This commit is contained in:
Richard Henderson 2002-03-31 01:42:10 -08:00 committed by Richard Henderson
parent fbb35f2255
commit 35ddbf5091
7 changed files with 47 additions and 20 deletions

View File

@ -1,3 +1,14 @@
2002-03-31 Richard Henderson <rth@redhat.com>
* builtins.c (expand_builtin_va_arg): Give warnings not errors for
promoted argument types; build trap.
(expand_builtin_trap): New.
(expand_builtin): Use it.
* stmt.c (expand_nl_goto_receivers): Likewise.
* expr.h (expand_builtin_trap): Declare.
* libfuncs.h (LTI_abort, abort_libfunc): New.
* optabs.c (init_optabs): Init abort_libfunc.
2002-03-30 David S. Miller <davem@redhat.com>
* config/sparc/linux.h (HANDLE_PRAGMA_PACK_PUSH_POP): Define.

View File

@ -3081,7 +3081,7 @@ expand_builtin_va_arg (valist, type)
else if ((promoted_type = (*lang_type_promotes_to) (type)) != NULL_TREE)
{
const char *name = "<anonymous type>", *pname = 0;
static int gave_help;
static bool gave_help;
if (TYPE_NAME (type))
{
@ -3100,13 +3100,24 @@ expand_builtin_va_arg (valist, type)
pname = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (promoted_type)));
}
error ("`%s' is promoted to `%s' when passed through `...'", name, pname);
/* Unfortunately, this is merely undefined, rather than a constraint
violation, so we cannot make this an error. If this call is never
executed, the program is still strictly conforming. */
warning ("`%s' is promoted to `%s' when passed through `...'",
name, pname);
if (! gave_help)
{
gave_help = 1;
error ("(so you should pass `%s' not `%s' to `va_arg')", pname, name);
gave_help = true;
warning ("(so you should pass `%s' not `%s' to `va_arg')",
pname, name);
}
/* We can, however, treat "undefined" any way we please.
Call abort to encourage the user to fix the program. */
expand_builtin_trap ();
/* This is dead code, but go ahead and finish so that the
mode of the result comes out right. */
addr = const0_rtx;
}
else
@ -3558,6 +3569,18 @@ expand_builtin_expect_jump (exp, if_false_label, if_true_label)
return ret;
}
void
expand_builtin_trap ()
{
#ifdef HAVE_trap
if (HAVE_trap)
emit_insn (gen_trap ());
else
#endif
emit_library_call (abort_libfunc, LCT_NORETURN, VOIDmode, 0);
emit_barrier ();
}
/* Expand an expression EXP that calls a built-in function,
with result going to TARGET if that's convenient
@ -3892,13 +3915,7 @@ expand_builtin (exp, target, subtarget, mode, ignore)
}
case BUILT_IN_TRAP:
#ifdef HAVE_trap
if (HAVE_trap)
emit_insn (gen_trap ());
else
#endif
error ("__builtin_trap not supported by this target");
emit_barrier ();
expand_builtin_trap ();
return const0_rtx;
case BUILT_IN_PUTCHAR:

View File

@ -340,7 +340,6 @@ extern rtx get_condition PARAMS ((rtx, rtx *));
extern rtx gen_cond_trap PARAMS ((enum rtx_code, rtx, rtx, rtx));
/* Functions from builtins.c: */
#ifdef TREE_CODE
extern rtx expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
extern void std_expand_builtin_va_start PARAMS ((int, tree, rtx));
extern rtx std_expand_builtin_va_arg PARAMS ((tree, tree));
@ -348,12 +347,11 @@ extern rtx expand_builtin_va_arg PARAMS ((tree, tree));
extern void default_init_builtins PARAMS ((void));
extern rtx default_expand_builtin PARAMS ((tree, rtx, rtx,
enum machine_mode, int));
#endif
extern void expand_builtin_setjmp_setup PARAMS ((rtx, rtx));
extern void expand_builtin_setjmp_receiver PARAMS ((rtx));
extern void expand_builtin_longjmp PARAMS ((rtx, rtx));
extern rtx expand_builtin_saveregs PARAMS ((void));
extern void expand_builtin_trap PARAMS ((void));
extern HOST_WIDE_INT get_varargs_alias_set PARAMS ((void));
extern HOST_WIDE_INT get_frame_alias_set PARAMS ((void));
extern void record_base_value PARAMS ((unsigned int, rtx, int));

View File

@ -36,6 +36,7 @@ enum libfunc_index
LTI_truncxfdf2,
LTI_trunctfdf2,
LTI_abort,
LTI_memcpy,
LTI_memmove,
LTI_bcopy,
@ -162,6 +163,7 @@ extern rtx libfunc_table[LTI_MAX];
#define truncxfdf2_libfunc (libfunc_table[LTI_truncxfdf2])
#define trunctfdf2_libfunc (libfunc_table[LTI_trunctfdf2])
#define abort_libfunc (libfunc_table[LTI_abort])
#define memcpy_libfunc (libfunc_table[LTI_memcpy])
#define memmove_libfunc (libfunc_table[LTI_memmove])
#define bcopy_libfunc (libfunc_table[LTI_bcopy])

View File

@ -4945,6 +4945,7 @@ init_optabs ()
truncxfdf2_libfunc = init_one_libfunc ("__truncxfdf2");
trunctfdf2_libfunc = init_one_libfunc ("__trunctfdf2");
abort_libfunc = init_one_libfunc ("abort");
memcpy_libfunc = init_one_libfunc ("memcpy");
memmove_libfunc = init_one_libfunc ("memmove");
bcopy_libfunc = init_one_libfunc ("bcopy");

View File

@ -3666,9 +3666,7 @@ expand_nl_goto_receivers (thisblock)
if (any_invalid)
{
expand_nl_goto_receiver ();
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "abort"), LCT_NORETURN,
VOIDmode, 0);
emit_barrier ();
expand_builtin_trap ();
}
nonlocal_goto_handler_labels = label_list;

View File

@ -7,7 +7,7 @@ volatile int i;
void foo()
{
i = va_arg(v, char); /* { dg-error "is promoted to|so you should" "char" } */
i = va_arg(v, short); /* { dg-error "is promoted to" "short" } */
i = va_arg(v, float); /* { dg-error "is promoted to" "float" } */
i = va_arg(v, char); /* { dg-warning "is promoted to|so you should" "char" } */
i = va_arg(v, short); /* { dg-warning "is promoted to" "short" } */
i = va_arg(v, float); /* { dg-warning "is promoted to" "float" } */
}