Provide support for empty arguments in macro invocations.

For this we always add a new argument to the argument list as soon as
possible, without waiting until we see some argument token. This does
mean we need to take some extra care when comparing the number of
arguments with the number of expected arguments. In addition to
matching numbers, we also support one (empty) argument when zero
arguments are expected.

Add a test case here for this, which does pass.
This commit is contained in:
Carl Worth 2010-05-27 13:29:19 -07:00
parent a65cf7b1d2
commit a19297b26e
2 changed files with 17 additions and 9 deletions

View file

@ -1044,7 +1044,8 @@ _arguments_parse (argument_list_t *arguments, token_node_t **node_ret)
last = node;
node = node->next;
argument = NULL;
argument = _token_list_create (arguments);
_argument_list_append (arguments, argument);
for (paren_count = 1; node; last = node, node = node->next) {
if (node->token->type == '(')
@ -1064,18 +1065,16 @@ _arguments_parse (argument_list_t *arguments, token_node_t **node_ret)
if (node->token->type == ',' &&
paren_count == 1)
{
if (argument)
_token_list_trim_trailing_space (argument);
argument = NULL;
_token_list_trim_trailing_space (argument);
argument = _token_list_create (arguments);
_argument_list_append (arguments, argument);
}
else {
if (argument == NULL) {
if (argument->head == NULL) {
/* Don't treat initial whitespace as
* part of the arguement. */
if (node->token->type == SPACE)
continue;
argument = _token_list_create (arguments);
_argument_list_append (arguments, argument);
}
_token_list_append (argument, node->token);
}
@ -1132,8 +1131,11 @@ _expand_function_onto (glcpp_parser_t *parser,
return FUNCTION_STATUS_SUCCESS;
}
if (_argument_list_length (arguments) !=
_string_list_length (macro->parameters))
if (! ((_argument_list_length (arguments) ==
_string_list_length (macro->parameters)) ||
(_string_list_length (macro->parameters) == 0 &&
_argument_list_length (arguments) == 1 &&
arguments->head->argument->head == NULL)))
{
fprintf (stderr,
"Error: macro %s invoked with %d arguments (expected %d)\n",

View file

@ -0,0 +1,6 @@
#define zero() success
zero()
#define one(x) success
one()
#define two(x,y) success
two(,)