(expand_builtin, case BUILT_IN_NEXT_ARG): Test whether an argunment
has been passed to __builtin_next_arg; warn if not. From-SVN: r6994
This commit is contained in:
parent
18e2b1c06e
commit
e4493c0410
29
gcc/expr.c
29
gcc/expr.c
|
@ -6961,8 +6961,6 @@ expand_builtin (exp, target, subtarget, mode, ignore)
|
||||||
case BUILT_IN_NEXT_ARG:
|
case BUILT_IN_NEXT_ARG:
|
||||||
{
|
{
|
||||||
tree fntype = TREE_TYPE (current_function_decl);
|
tree fntype = TREE_TYPE (current_function_decl);
|
||||||
tree last_parm = tree_last (DECL_ARGUMENTS (current_function_decl));
|
|
||||||
tree arg;
|
|
||||||
|
|
||||||
if (TYPE_ARG_TYPES (fntype) == 0
|
if (TYPE_ARG_TYPES (fntype) == 0
|
||||||
|| (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
|
|| (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
|
||||||
|
@ -6973,15 +6971,24 @@ expand_builtin (exp, target, subtarget, mode, ignore)
|
||||||
return const0_rtx;
|
return const0_rtx;
|
||||||
}
|
}
|
||||||
|
|
||||||
arg = TREE_VALUE (arglist);
|
if (arglist)
|
||||||
/* Strip off all nops for the sake of the comparison. This is not
|
{
|
||||||
quite the same as STRIP_NOPS. It does more. */
|
tree last_parm = tree_last (DECL_ARGUMENTS (current_function_decl));
|
||||||
while (TREE_CODE (arg) == NOP_EXPR
|
tree arg = TREE_VALUE (arglist);
|
||||||
|| TREE_CODE (arg) == CONVERT_EXPR
|
|
||||||
|| TREE_CODE (arg) == NON_LVALUE_EXPR)
|
/* Strip off all nops for the sake of the comparison. This
|
||||||
arg = TREE_OPERAND (arg, 0);
|
is not quite the same as STRIP_NOPS. It does more. */
|
||||||
if (arg != last_parm)
|
while (TREE_CODE (arg) == NOP_EXPR
|
||||||
warning ("second parameter of `va_start' not last named argument");
|
|| TREE_CODE (arg) == CONVERT_EXPR
|
||||||
|
|| TREE_CODE (arg) == NON_LVALUE_EXPR)
|
||||||
|
arg = TREE_OPERAND (arg, 0);
|
||||||
|
if (arg != last_parm)
|
||||||
|
warning ("second parameter of `va_start' not last named argument");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* Evidently an out of date version of <stdarg.h>; can't validate
|
||||||
|
va_start's second argument, but can still work as intended. */
|
||||||
|
warning ("`__builtin_next_arg' called without an argument");
|
||||||
}
|
}
|
||||||
|
|
||||||
return expand_binop (Pmode, add_optab,
|
return expand_binop (Pmode, add_optab,
|
||||||
|
|
Loading…
Reference in New Issue