summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2014-06-25 13:41:47 -0700
committerCarl Worth <cworth@cworth.org>2014-07-29 15:11:50 -0700
commit34cd293c8ac6df6284f94fd456eee7ddc847c5df (patch)
treef04865bbda7f5fe42b0d1e61e97c12a3e5ed7094 /src/glsl
parentfe1e0ac8524677c40c84f238650e0e198f0e8d36 (diff)
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>
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/glcpp/glcpp-parse.y29
-rw-r--r--src/glsl/glcpp/tests/135-duplicate-parameter.c2
-rw-r--r--src/glsl/glcpp/tests/135-duplicate-parameter.c.expected4
3 files changed, 35 insertions, 0 deletions
diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
index f75834514f2..38d84046d57 100644
--- a/src/glsl/glcpp/glcpp-parse.y
+++ b/src/glsl/glcpp/glcpp-parse.y
@@ -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);
diff --git a/src/glsl/glcpp/tests/135-duplicate-parameter.c b/src/glsl/glcpp/tests/135-duplicate-parameter.c
new file mode 100644
index 00000000000..fd96bd64c74
--- /dev/null
+++ b/src/glsl/glcpp/tests/135-duplicate-parameter.c
@@ -0,0 +1,2 @@
+#define FOO(a,a) which a?
+#define BAR(x,y,z,x) so very x
diff --git a/src/glsl/glcpp/tests/135-duplicate-parameter.c.expected b/src/glsl/glcpp/tests/135-duplicate-parameter.c.expected
new file mode 100644
index 00000000000..bc1a334ed29
--- /dev/null
+++ b/src/glsl/glcpp/tests/135-duplicate-parameter.c.expected
@@ -0,0 +1,4 @@
+0:1(9): preprocessor error: Duplicate macro parameter "a"
+0:2(9): preprocessor error: Duplicate macro parameter "x"
+
+