mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-08 15:42:07 +08:00
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: r51643
This commit is contained in:
parent
b56bc85a40
commit
9602f5a04b
@ -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-31 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* gcc.c (LIBGCC_SPEC): Folded %L and duplicate %G here...
|
||||
|
@ -3079,7 +3079,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))
|
||||
{
|
||||
@ -3098,13 +3098,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
|
||||
@ -3556,6 +3567,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
|
||||
@ -3890,13 +3913,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:
|
||||
|
@ -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));
|
||||
|
@ -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])
|
||||
|
@ -5076,6 +5076,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");
|
||||
|
@ -3667,9 +3667,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;
|
||||
|
@ -1,3 +1,7 @@
|
||||
2002-03-31 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* gcc.dg/va-arg-1.c: Expect warnings, not errors.
|
||||
|
||||
2002-03-31 Kazu Hirata <kazu@hxi.com>
|
||||
|
||||
* gcc.dg/weak-1.c: Disable on h8300 port.
|
||||
|
@ -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" } */
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user