Commit d3c29f57 by Geoff Lang

Add pragma errors for malformed pragmas.

Instead of always warning on invalid pragmas, only warn when the pragma type is not recognized and error when the syntax is invalid. Fixes: dEQP-GLES2.functional.shaders.preprocessor.pragmas.invalid_pragma_invalid_debug_vertex dEQP-GLES2.functional.shaders.preprocessor.pragmas.invalid_pragma_invalid_debug_fragment dEQP-GLES2.functional.shaders.preprocessor.pragmas.invalid_pragma_invalid_token_vertex dEQP-GLES2.functional.shaders.preprocessor.pragmas.invalid_pragma_invalid_token_fragment BUG=angleproject:989 Change-Id: Ibd584dc08a2436e163dfc52eeffdf2dac8a22cb8 Reviewed-on: https://chromium-review.googlesource.com/267639Reviewed-by: 's avatarZhenyao Mo <zmo@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent b819d25d
...@@ -109,6 +109,10 @@ std::string Diagnostics::message(ID id) ...@@ -109,6 +109,10 @@ std::string Diagnostics::message(ID id)
return "invalid file number"; return "invalid file number";
case PP_INVALID_LINE_DIRECTIVE: case PP_INVALID_LINE_DIRECTIVE:
return "invalid line directive"; return "invalid line directive";
case PP_INVALID_PRAGMA:
return "invalid pragma";
case PP_INVALID_PRAGMA_VALUE:
return "invalid pragma value, must be 'on' or 'off'";
// Errors end. // Errors end.
// Warnings begin. // Warnings begin.
case PP_EOF_IN_DIRECTIVE: case PP_EOF_IN_DIRECTIVE:
......
...@@ -61,6 +61,8 @@ class Diagnostics ...@@ -61,6 +61,8 @@ class Diagnostics
PP_INVALID_LINE_NUMBER, PP_INVALID_LINE_NUMBER,
PP_INVALID_FILE_NUMBER, PP_INVALID_FILE_NUMBER,
PP_INVALID_LINE_DIRECTIVE, PP_INVALID_LINE_DIRECTIVE,
PP_INVALID_PRAGMA,
PP_INVALID_PRAGMA_VALUE,
PP_ERROR_END, PP_ERROR_END,
PP_WARNING_BEGIN, PP_WARNING_BEGIN,
......
...@@ -616,7 +616,8 @@ void DirectiveParser::parsePragma(Token *token) ...@@ -616,7 +616,8 @@ void DirectiveParser::parsePragma(Token *token)
break; break;
case PRAGMA_VALUE: case PRAGMA_VALUE:
value = token->text; value = token->text;
valid = valid && (token->type == Token::IDENTIFIER); // Pragma value validation is handled in DirectiveHandler::handlePragma
// because the proper pragma value is dependent on the pragma name.
break; break;
case RIGHT_PAREN: case RIGHT_PAREN:
valid = valid && (token->type == ')'); valid = valid && (token->type == ')');
...@@ -633,7 +634,7 @@ void DirectiveParser::parsePragma(Token *token) ...@@ -633,7 +634,7 @@ void DirectiveParser::parsePragma(Token *token)
(state == RIGHT_PAREN + 1)); // With value. (state == RIGHT_PAREN + 1)); // With value.
if (!valid) if (!valid)
{ {
mDiagnostics->report(Diagnostics::PP_UNRECOGNIZED_PRAGMA, mDiagnostics->report(Diagnostics::PP_INVALID_PRAGMA,
token->location, name); token->location, name);
} }
else if (state > PRAGMA_NAME) // Do not notify for empty pragma. else if (state > PRAGMA_NAME) // Do not notify for empty pragma.
......
...@@ -98,9 +98,8 @@ void TDirectiveHandler::handlePragma(const pp::SourceLocation& loc, ...@@ -98,9 +98,8 @@ void TDirectiveHandler::handlePragma(const pp::SourceLocation& loc,
if (invalidValue) if (invalidValue)
{ {
mDiagnostics.writeInfo(pp::Diagnostics::PP_ERROR, loc, mDiagnostics.report(pp::Diagnostics::PP_INVALID_PRAGMA_VALUE, loc, value);
"invalid pragma value", value, return;
"'on' or 'off' expected");
} }
} }
} }
......
...@@ -137,9 +137,9 @@ TEST_P(InvalidPragmaTest, Identified) ...@@ -137,9 +137,9 @@ TEST_P(InvalidPragmaTest, Identified)
using testing::_; using testing::_;
// No handlePragma calls. // No handlePragma calls.
EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _, false)).Times(0); EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _, false)).Times(0);
// Unrecognized pragma warning. // Invalid pragma error.
EXPECT_CALL(mDiagnostics, EXPECT_CALL(mDiagnostics,
print(pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, print(pp::Diagnostics::PP_INVALID_PRAGMA,
pp::SourceLocation(0, 1), _)); pp::SourceLocation(0, 1), _));
preprocess(str, expected); preprocess(str, expected);
......
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