Validate that all preprocessor function arguments are unique.

Fixes:
dEQP-GLES2.functional.shaders.preprocessor.invalid_function_definitions.unique_param_name_vertex
dEQP-GLES2.functional.shaders.preprocessor.invalid_function_definitions.unique_param_name_fragment

BUG=angleproject:989

Change-Id: I32198f1c9036c371b46e7ad2986a44e42fd38e20
Reviewed-on: https://chromium-review.googlesource.com/267396
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/compiler/preprocessor/DirectiveParser.cpp b/src/compiler/preprocessor/DirectiveParser.cpp
index cbc6ce0..b38f332 100644
--- a/src/compiler/preprocessor/DirectiveParser.cpp
+++ b/src/compiler/preprocessor/DirectiveParser.cpp
@@ -6,6 +6,7 @@
 
 #include "DirectiveParser.h"
 
+#include <algorithm>
 #include <cassert>
 #include <cstdlib>
 #include <sstream>
@@ -364,6 +365,14 @@
             mTokenizer->lex(token);
             if (token->type != Token::IDENTIFIER)
                 break;
+
+            if (std::find(macro.parameters.begin(), macro.parameters.end(), token->text) != macro.parameters.end())
+            {
+                mDiagnostics->report(Diagnostics::PP_MACRO_DUPLICATE_PARAMETER_NAMES,
+                                     token->location, token->text);
+                return;
+            }
+
             macro.parameters.push_back(token->text);
 
             mTokenizer->lex(token);  // Get ','.