Commit 26be18da by Geoff Lang

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/267396Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarZhenyao Mo <zmo@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent f74fef50
...@@ -78,6 +78,8 @@ std::string Diagnostics::message(ID id) ...@@ -78,6 +78,8 @@ std::string Diagnostics::message(ID id)
return "Not enough arguments for macro"; return "Not enough arguments for macro";
case PP_MACRO_TOO_MANY_ARGS: case PP_MACRO_TOO_MANY_ARGS:
return "Too many arguments for macro"; return "Too many arguments for macro";
case PP_MACRO_DUPLICATE_PARAMETER_NAMES:
return "duplicate macro parameter name";
case PP_CONDITIONAL_ENDIF_WITHOUT_IF: case PP_CONDITIONAL_ENDIF_WITHOUT_IF:
return "unexpected #endif found without a matching #if"; return "unexpected #endif found without a matching #if";
case PP_CONDITIONAL_ELSE_WITHOUT_IF: case PP_CONDITIONAL_ELSE_WITHOUT_IF:
......
...@@ -46,6 +46,7 @@ class Diagnostics ...@@ -46,6 +46,7 @@ class Diagnostics
PP_MACRO_UNTERMINATED_INVOCATION, PP_MACRO_UNTERMINATED_INVOCATION,
PP_MACRO_TOO_FEW_ARGS, PP_MACRO_TOO_FEW_ARGS,
PP_MACRO_TOO_MANY_ARGS, PP_MACRO_TOO_MANY_ARGS,
PP_MACRO_DUPLICATE_PARAMETER_NAMES,
PP_CONDITIONAL_ENDIF_WITHOUT_IF, PP_CONDITIONAL_ENDIF_WITHOUT_IF,
PP_CONDITIONAL_ELSE_WITHOUT_IF, PP_CONDITIONAL_ELSE_WITHOUT_IF,
PP_CONDITIONAL_ELSE_AFTER_ELSE, PP_CONDITIONAL_ELSE_AFTER_ELSE,
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "DirectiveParser.h" #include "DirectiveParser.h"
#include <algorithm>
#include <cassert> #include <cassert>
#include <cstdlib> #include <cstdlib>
#include <sstream> #include <sstream>
...@@ -364,6 +365,14 @@ void DirectiveParser::parseDefine(Token *token) ...@@ -364,6 +365,14 @@ void DirectiveParser::parseDefine(Token *token)
mTokenizer->lex(token); mTokenizer->lex(token);
if (token->type != Token::IDENTIFIER) if (token->type != Token::IDENTIFIER)
break; 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); macro.parameters.push_back(token->text);
mTokenizer->lex(token); // Get ','. mTokenizer->lex(token); // Get ','.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment