diff options
Diffstat (limited to 'gcc/c-common.c')
-rw-r--r-- | gcc/c-common.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/gcc/c-common.c b/gcc/c-common.c index 6b753dc..24280ae 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -5143,14 +5143,21 @@ check_function_nonnull (tree attrs, tree params) from the end) is a (pointer)0. */ static void -check_function_sentinel (tree attrs, tree params) +check_function_sentinel (tree attrs, tree params, tree typelist) { tree attr = lookup_attribute ("sentinel", attrs); if (attr) { - if (!params) - warning (0, "missing sentinel in function call"); + /* Skip over the named arguments. */ + while (typelist && params) + { + typelist = TREE_CHAIN (typelist); + params = TREE_CHAIN (params); + } + + if (typelist || !params) + warning (0, "not enough variable arguments to fit a sentinel"); else { tree sentinel, end; @@ -5172,7 +5179,7 @@ check_function_sentinel (tree attrs, tree params) } if (pos > 0) { - warning (0, "not enough arguments to fit a sentinel"); + warning (0, "not enough variable arguments to fit a sentinel"); return; } @@ -5386,7 +5393,7 @@ handle_sentinel_attribute (tree *node, tree name, tree args, /* Check for valid arguments being passed to a function. */ void -check_function_arguments (tree attrs, tree params) +check_function_arguments (tree attrs, tree params, tree typelist) { /* Check for null being passed in a pointer argument that must be non-null. We also need to do this if format checking is enabled. */ @@ -5399,7 +5406,7 @@ check_function_arguments (tree attrs, tree params) if (warn_format) { check_function_format (attrs, params); - check_function_sentinel (attrs, params); + check_function_sentinel (attrs, params, typelist); } } |