glsl/glcpp: Emit error for duplicate parameter name in function-like macro

This will emit an error for something like:

	#define FOO(x,x) ...

Obviously, it's not a legal thing to do, and it's easy to check.

Add a "make check" test for this as well.

This fixes the following Khronos GLES3 CTS tests:

	invalid_function_definitions.unique_param_name_vertex
	invalid_function_definitions.unique_param_name_fragment

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
Carl Worth 2014-06-25 13:41:47 -07:00
parent fe1e0ac852
commit 34cd293c8a
3 changed files with 35 additions and 0 deletions

View file

@ -57,6 +57,9 @@ _string_list_append_item (string_list_t *list, const char *str);
static int
_string_list_contains (string_list_t *list, const char *member, int *index);
static const char *
_string_list_has_duplicate (string_list_t *list);
static int
_string_list_length (string_list_t *list);
@ -794,6 +797,25 @@ _string_list_contains (string_list_t *list, const char *member, int *index)
return 0;
}
/* Return duplicate string in list (if any), NULL otherwise. */
const char *
_string_list_has_duplicate (string_list_t *list)
{
string_node_t *node, *dup;
if (list == NULL)
return NULL;
for (node = list->head; node; node = node->next) {
for (dup = node->next; dup; dup = dup->next) {
if (strcmp (node->str, dup->str) == 0)
return node->str;
}
}
return NULL;
}
int
_string_list_length (string_list_t *list)
{
@ -1980,9 +2002,16 @@ _define_function_macro (glcpp_parser_t *parser,
token_list_t *replacements)
{
macro_t *macro, *previous;
const char *dup;
_check_for_reserved_macro_name(parser, loc, identifier);
/* Check for any duplicate parameter names. */
if ((dup = _string_list_has_duplicate (parameters)) != NULL) {
glcpp_error (loc, parser, "Duplicate macro parameter \"%s\"",
dup);
}
macro = ralloc (parser, macro_t);
ralloc_steal (macro, parameters);
ralloc_steal (macro, replacements);

View file

@ -0,0 +1,2 @@
#define FOO(a,a) which a?
#define BAR(x,y,z,x) so very x

View file

@ -0,0 +1,4 @@
0:1(9): preprocessor error: Duplicate macro parameter "a"
0:2(9): preprocessor error: Duplicate macro parameter "x"