aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-04-06 21:33:57 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1994-04-06 21:33:57 -0400
commite4493c0410bece35a3acc5956270a6cb66a2bafa (patch)
treeef5a2af4c3e210d085ab9612e4c996db2d49ba46
parent18e2b1c06ed8c34393fb517d1ff4d27bd04389f8 (diff)
downloadgcc-e4493c0410bece35a3acc5956270a6cb66a2bafa.zip
gcc-e4493c0410bece35a3acc5956270a6cb66a2bafa.tar.gz
gcc-e4493c0410bece35a3acc5956270a6cb66a2bafa.tar.bz2
(expand_builtin, case BUILT_IN_NEXT_ARG): Test whether an argunment
has been passed to __builtin_next_arg; warn if not. From-SVN: r6994
-rw-r--r--gcc/expr.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 6339b45..f8531ff 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6961,8 +6961,6 @@ expand_builtin (exp, target, subtarget, mode, ignore)
case BUILT_IN_NEXT_ARG:
{
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
|| (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
@@ -6973,15 +6971,24 @@ expand_builtin (exp, target, subtarget, mode, ignore)
return const0_rtx;
}
- arg = TREE_VALUE (arglist);
- /* Strip off all nops for the sake of the comparison. This is not
- quite the same as STRIP_NOPS. It does more. */
- while (TREE_CODE (arg) == NOP_EXPR
- || 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");
+ if (arglist)
+ {
+ tree last_parm = tree_last (DECL_ARGUMENTS (current_function_decl));
+ tree arg = TREE_VALUE (arglist);
+
+ /* Strip off all nops for the sake of the comparison. This
+ is not quite the same as STRIP_NOPS. It does more. */
+ while (TREE_CODE (arg) == NOP_EXPR
+ || 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,