Add compile error on using inputs with interpolation qualifier as l-value
This patch intends to fix a compile error in ANGLE GLSL compiler when
parsing an expression with inputs which has interpolation qualifiers
('flat', 'smooth' and 'centroid').
The compiler should report a compile error when a shader input with
interpolation qualifier is used as a l-value.
BUG=angleproject:2140
TEST=angle_unittests
Change-Id: I7c059d53bf001ac31d34519a98e5289797833ce7
Reviewed-on: https://chromium-review.googlesource.com/640075
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index 23f4a3a..4216a71 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -474,9 +474,10 @@
message = "can't modify an attribute";
break;
case EvqFragmentIn:
- message = "can't modify an input";
- break;
case EvqVertexIn:
+ case EvqFlatIn:
+ case EvqSmoothIn:
+ case EvqCentroidIn:
message = "can't modify an input";
break;
case EvqUniform:
diff --git a/src/tests/compiler_tests/ShaderValidation_test.cpp b/src/tests/compiler_tests/ShaderValidation_test.cpp
index 1b26688..3844200 100644
--- a/src/tests/compiler_tests/ShaderValidation_test.cpp
+++ b/src/tests/compiler_tests/ShaderValidation_test.cpp
@@ -4691,3 +4691,63 @@
FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
}
}
+
+// Test that a shader input with 'flat' qualifier cannot be used as l-value.
+TEST_F(FragmentShaderValidationTest, AssignValueToFlatIn)
+{
+ const std::string &shaderString =
+ "#version 310 es\n"
+ "precision mediump float;\n"
+ "flat in float value;\n"
+ "out vec4 o_color;\n"
+ "void main()\n"
+ "{\n"
+ " value = 1.0;\n"
+ " o_color = vec4(1.0, 0.0, 0.0, 1.0);"
+ "}\n";
+
+ if (compile(shaderString))
+ {
+ FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
+ }
+}
+
+// Test that a shader input with 'smooth' qualifier cannot be used as l-value.
+TEST_F(FragmentShaderValidationTest, AssignValueToSmoothIn)
+{
+ const std::string &shaderString =
+ "#version 310 es\n"
+ "precision mediump float;\n"
+ "smooth in float value;\n"
+ "out vec4 o_color;\n"
+ "void main()\n"
+ "{\n"
+ " value = 1.0;\n"
+ " o_color = vec4(1.0, 0.0, 0.0, 1.0);"
+ "}\n";
+
+ if (compile(shaderString))
+ {
+ FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
+ }
+}
+
+// Test that a shader input with 'centroid' qualifier cannot be used as l-value.
+TEST_F(FragmentShaderValidationTest, AssignValueToCentroidIn)
+{
+ const std::string &shaderString =
+ "#version 310 es\n"
+ "precision mediump float;\n"
+ "centroid in float value;\n"
+ "out vec4 o_color;\n"
+ "void main()\n"
+ "{\n"
+ " value = 1.0;\n"
+ " o_color = vec4(1.0, 0.0, 0.0, 1.0);"
+ "}\n";
+
+ if (compile(shaderString))
+ {
+ FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
+ }
+}