diff options
author | Jim Wilson <wilson@gcc.gnu.org> | 1994-03-23 14:16:55 -0800 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1994-03-23 14:16:55 -0800 |
commit | c4dfe0fc0670efc7757af77f9b98c521b66a44eb (patch) | |
tree | ab62855921c86085618538965f6b6c34be58e64a /gcc | |
parent | 8d0aed47064e753be675137782a541087d20b648 (diff) | |
download | gcc-c4dfe0fc0670efc7757af77f9b98c521b66a44eb.zip gcc-c4dfe0fc0670efc7757af77f9b98c521b66a44eb.tar.gz gcc-c4dfe0fc0670efc7757af77f9b98c521b66a44eb.tar.bz2 |
(expand_builtin, BUILT_IN_NEXT_ARG case): Verify that
parameter is last named argument.
From-SVN: r6854
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/expr.c | 29 |
1 files changed, 18 insertions, 11 deletions
@@ -6956,24 +6956,31 @@ expand_builtin (exp, target, subtarget, mode, ignore) #endif } - /* Return the address of the first anonymous stack arg. */ + /* Return the address of the first anonymous stack arg. + This should only be used for stdarg functions. */ case BUILT_IN_NEXT_ARG: { - tree parm; tree fntype = TREE_TYPE (current_function_decl); - tree fnargs = DECL_ARGUMENTS (current_function_decl); - if (!(TYPE_ARG_TYPES (fntype) != 0 - && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype))) - != void_type_node)) - && !(fnargs - && (parm = tree_last (fnargs)) != 0 - && DECL_NAME (parm) - && (! strcmp (IDENTIFIER_POINTER (DECL_NAME (parm)), - "__builtin_va_alist")))) + 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))) + == void_type_node)) { error ("`va_start' used in function with fixed args"); 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"); } return expand_binop (Pmode, add_optab, |