[Mesa-dev] [PATCH 19/23] glsl/glcpp: Add (non)-support for ++ and -- operators

Carl Worth cworth at cworth.org
Thu Jun 26 15:19:19 PDT 2014


These operators aren't defined for preprocessor expressions, so we never
implemented them. This led them to be misinterpreted as strings of unary
'+' or '-' operators.

In fact, what is actually desired is to generate an error if these operators
appear in any preprocessor condition.

So this commit looks like it is strictly adding support for these
operators. And it is supporting them as far as passing them through to the
subsequent compiler, (which was already happening anyway).

What's less apparent in the commit is that with these tokens now being lexed,
but with no change to the grammar for preprocessor expressions, these
operators will now trigger errors there.

A new "make check" test is added to verify the desired behavior.

This commit fixes the following Khronos GLES3 CTS test:

	invalid_op_1_vertex
	invalid_op_1_fragment
	invalid_op_2_vertex
	invalid_op_2_fragment
---
 src/glsl/glcpp/glcpp-lex.l                                    |  8 ++++++++
 src/glsl/glcpp/glcpp-parse.y                                  | 10 +++++++++-
 src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c          |  8 ++++++++
 src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c.expected |  8 ++++++++
 4 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c
 create mode 100644 src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c.expected

diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l
index 5abefbf..3d32cf4 100644
--- a/src/glsl/glcpp/glcpp-lex.l
+++ b/src/glsl/glcpp/glcpp-lex.l
@@ -469,6 +469,14 @@ HEXADECIMAL_INTEGER	0[xX][0-9a-fA-F]+[uU]?
 	RETURN_TOKEN (OR);
 }
 
+"++" {
+	RETURN_TOKEN (PLUS_PLUS);
+}
+
+"--" {
+	RETURN_TOKEN (MINUS_MINUS);
+}
+
 "##" {
 	if (! parser->skipping) {
 		if (parser->is_gles)
diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
index 4af3bc3..f592247 100644
--- a/src/glsl/glcpp/glcpp-parse.y
+++ b/src/glsl/glcpp/glcpp-parse.y
@@ -171,7 +171,7 @@ add_builtin_define(glcpp_parser_t *parser, const char *name, int value);
 	/* We use HASH_TOKEN, DEFINE_TOKEN and VERSION_TOKEN (as opposed to
          * HASH, DEFINE, and VERSION) to avoid conflicts with other symbols,
          * (such as the <HASH> and <DEFINE> start conditions in the lexer). */
-%token COMMA_FINAL DEFINED ELIF_EXPANDED HASH_TOKEN DEFINE_TOKEN FUNC_IDENTIFIER OBJ_IDENTIFIER ELIF ELSE ENDIF ERROR IF IFDEF IFNDEF LINE PRAGMA UNDEF VERSION_TOKEN GARBAGE IDENTIFIER IF_EXPANDED INTEGER INTEGER_STRING LINE_EXPANDED NEWLINE OTHER PLACEHOLDER SPACE
+%token COMMA_FINAL DEFINED ELIF_EXPANDED HASH_TOKEN DEFINE_TOKEN FUNC_IDENTIFIER OBJ_IDENTIFIER ELIF ELSE ENDIF ERROR IF IFDEF IFNDEF LINE PRAGMA UNDEF VERSION_TOKEN GARBAGE IDENTIFIER IF_EXPANDED INTEGER INTEGER_STRING LINE_EXPANDED NEWLINE OTHER PLACEHOLDER SPACE PLUS_PLUS MINUS_MINUS
 %token PASTE
 %type <ival> INTEGER operator SPACE integer_constant
 %type <expression_value> expression
@@ -741,6 +741,8 @@ operator:
 |	','			{ $$ = ','; }
 |	'='			{ $$ = '='; }
 |	PASTE			{ $$ = PASTE; }
+|	PLUS_PLUS		{ $$ = PLUS_PLUS; }
+|	MINUS_MINUS		{ $$ = MINUS_MINUS; }
 ;
 
 %%
@@ -1161,6 +1163,12 @@ _token_print (char **out, size_t *len, token_t *token)
 	case PASTE:
 		ralloc_asprintf_rewrite_tail (out, len, "##");
 		break;
+        case PLUS_PLUS:
+		ralloc_asprintf_rewrite_tail (out, len, "++");
+		break;
+        case MINUS_MINUS:
+		ralloc_asprintf_rewrite_tail (out, len, "--");
+		break;
 	case COMMA_FINAL:
 		ralloc_asprintf_rewrite_tail (out, len, ",");
 		break;
diff --git a/src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c b/src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c
new file mode 100644
index 0000000..167d3c8
--- /dev/null
+++ b/src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c
@@ -0,0 +1,8 @@
+/* The body can include C expressions with ++ and -- */
+a = x++;
+b = ++x;
+c = x--;
+d = --x;
+/* But these are not legal in preprocessor expressions. */
+#if x++ > 4
+#endif
diff --git a/src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c.expected b/src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c.expected
new file mode 100644
index 0000000..137921b
--- /dev/null
+++ b/src/glsl/glcpp/tests/135-plus-plus-and-minus-minus.c.expected
@@ -0,0 +1,8 @@
+0:7(12): preprocessor error: syntax error, unexpected PLUS_PLUS
+ 
+a = x++;
+b = ++x;
+c = x--;
+d = --x;
+ 
+
-- 
2.0.0



More information about the mesa-dev mailing list