Commit ab4505a2 by Nicolas Capens

Validate that all function-like-macro arguments are unique.

Change-Id: Idc8c2a241af91916857ba015b061ce655b33e866 Reviewed-on: https://swiftshader-review.googlesource.com/5179Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent d39bf998
...@@ -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 MACRO_TOO_MANY_ARGS: case MACRO_TOO_MANY_ARGS:
return "Too many arguments for macro"; return "Too many arguments for macro";
case MACRO_DUPLICATE_PARAMETER_NAMES:
return "duplicate macro parameter name";
case CONDITIONAL_ENDIF_WITHOUT_IF: case CONDITIONAL_ENDIF_WITHOUT_IF:
return "unexpected #endif found without a matching #if"; return "unexpected #endif found without a matching #if";
case CONDITIONAL_ELSE_WITHOUT_IF: case CONDITIONAL_ELSE_WITHOUT_IF:
......
...@@ -46,6 +46,7 @@ class Diagnostics ...@@ -46,6 +46,7 @@ class Diagnostics
MACRO_UNTERMINATED_INVOCATION, MACRO_UNTERMINATED_INVOCATION,
MACRO_TOO_FEW_ARGS, MACRO_TOO_FEW_ARGS,
MACRO_TOO_MANY_ARGS, MACRO_TOO_MANY_ARGS,
MACRO_DUPLICATE_PARAMETER_NAMES,
CONDITIONAL_ENDIF_WITHOUT_IF, CONDITIONAL_ENDIF_WITHOUT_IF,
CONDITIONAL_ELSE_WITHOUT_IF, CONDITIONAL_ELSE_WITHOUT_IF,
CONDITIONAL_ELSE_AFTER_ELSE, CONDITIONAL_ELSE_AFTER_ELSE,
......
...@@ -361,6 +361,14 @@ void DirectiveParser::parseDefine(Token* token) ...@@ -361,6 +361,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::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