mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 00:00:11 +01:00
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:
parent
a65cf7b1d2
commit
a19297b26e
2 changed files with 17 additions and 9 deletions
|
|
@ -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",
|
||||
|
|
|
|||
6
tests/057-empty-arguments.c
Normal file
6
tests/057-empty-arguments.c
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#define zero() success
|
||||
zero()
|
||||
#define one(x) success
|
||||
one()
|
||||
#define two(x,y) success
|
||||
two(,)
|
||||
Loading…
Add table
Reference in a new issue