summaryrefslogtreecommitdiffstats
path: root/src/glsl/glcpp/glcpp.h
diff options
context:
space:
mode:
authorCarl Worth <[email protected]>2014-06-13 14:54:46 -0700
committerCarl Worth <[email protected]>2014-07-09 12:05:13 -0700
commitec6222ef014ca336e540e13fda423fd9f927feb1 (patch)
treeaefbb036e60e8501788379868e0ff797dea6e650 /src/glsl/glcpp/glcpp.h
parent9794f8f2452b796740a30abf6d6454452ff3f028 (diff)
glsl/glcpp: Add short-circuiting for || and && in #if/#elif for OpenGL ES.
The GLSL ES Specification 3.00.4 says: #if, #ifdef, #ifndef, #else, #elif, and #endif are defined to operate as for C++ except for the following: ... • Undefined identifiers not consumed by the defined operator do not default to '0'. Use of such identifiers causes an error. [Page 11 (page 127 of the PDF file)] as well as: The semantics of applying operators in the preprocessor match those standard in the C++ preprocessor with the following exceptions: • The 2nd operand in a logical and ('&&') operation is evaluated if and only if the 1st operand evaluates to non-zero. • The 2nd operand in a logical or ('||') operation is evaluated if and only if the 1st operand evaluates to zero. If an operand is not evaluated, the presence of undefined identifiers in the operand will not cause an error. (Note that neither of these deviations from C++ preprocessor behavior apply to non-ES GLSL, at least as of specfication version 4.30.6). The first portion of this, (generating an error for an undefined macro in an (short-circuiting to squelch errors), was not implemented previously, but is implemented in this commit. A test is added for "make check" to ensure this behavior. Note: The change as implemented does make the error message a bit less precise, (it just states that an undefined macro was encountered, but not the name of the macro). This commit fixes the following Khronos GLES3 conformance test: undefined_identifiers.valid_undefined_identifier_1_vertex undefined_identifiers.valid_undefined_identifier_1_fragment undefined_identifiers.valid_undefined_identifier_2_vertex undefined_identifiers.valid_undefined_identifier_2_fragment Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/glsl/glcpp/glcpp.h')
-rw-r--r--src/glsl/glcpp/glcpp.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/glsl/glcpp/glcpp.h b/src/glsl/glcpp/glcpp.h
index b2654ffbed2..9783210b708 100644
--- a/src/glsl/glcpp/glcpp.h
+++ b/src/glsl/glcpp/glcpp.h
@@ -37,6 +37,12 @@
/* Some data types used for parser values. */
+typedef struct expression_value {
+ intmax_t value;
+ bool has_undefined;
+} expression_value_t;
+
+
typedef struct string_node {
const char *str;
struct string_node *next;
@@ -53,6 +59,7 @@ typedef struct token_list token_list_t;
typedef union YYSTYPE
{
intmax_t ival;
+ expression_value_t expression_value;
char *str;
string_list_t *string_list;
token_t *token;