diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-04-06 21:33:57 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-04-06 21:33:57 -0400 |
commit | e4493c0410bece35a3acc5956270a6cb66a2bafa (patch) | |
tree | ef5a2af4c3e210d085ab9612e4c996db2d49ba46 /gcc | |
parent | 18e2b1c06ed8c34393fb517d1ff4d27bd04389f8 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/expr.c | 29 |
1 files changed, 18 insertions, 11 deletions
@@ -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, |