Mesa (glsl2): glcpp: Fix support for nested #ifdef and nested #ifndef

Ian Romanick idr at kemper.freedesktop.org
Wed Jul 21 00:07:47 UTC 2010


Module: Mesa
Branch: glsl2
Commit: 1d7e03e48e87328ce0081021dde133921b78b406
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1d7e03e48e87328ce0081021dde133921b78b406

Author: Carl Worth <cworth at cworth.org>
Date:   Tue Jul 20 14:13:32 2010 -0700

glcpp: Fix support for nested #ifdef and nested #ifndef

Previously, if the outer #ifdef/#ifndef evaluated to false, the inner
directive would not be parsed correctly, (the identifier as the subject
of the #ifdef/#ifndef would inadvertently be skipped along with the other
content correctly being skipped).

We fix this by setting the lexing_if state in each case here.

We also add a new test to the test suite to ensure that this case is tested.

---

 src/glsl/glcpp/glcpp-lex.l                         |    6 ++-
 src/glsl/glcpp/tests/067-nested-ifdef-ifndef.c     |   40 +++++++++++++++++++
 .../glcpp/tests/067-nested-ifdef-ifndef.c.expected |   41 ++++++++++++++++++++
 3 files changed, 85 insertions(+), 2 deletions(-)

diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l
index a81c8f9..6773832 100644
--- a/src/glsl/glcpp/glcpp-lex.l
+++ b/src/glsl/glcpp/glcpp-lex.l
@@ -90,16 +90,18 @@ HEXADECIMAL_INTEGER	0[xX][0-9a-fA-F]+[uU]?
 }
 
 {HASH}ifdef/.*\n {
+	yyextra->lexing_if = 1;
 	yyextra->space_tokens = 0;
 	return HASH_IFDEF;
 }
 
 {HASH}ifndef/.*\n {
+	yyextra->lexing_if = 1;
 	yyextra->space_tokens = 0;
 	return HASH_IFNDEF;
 }
 
-{HASH}if{HSPACE}*/[^_a-zA-Z0-9].*\n {
+{HASH}if/[^_a-zA-Z0-9].*\n {
 	yyextra->lexing_if = 1;
 	yyextra->space_tokens = 0;
 	return HASH_IF;
@@ -122,7 +124,7 @@ HEXADECIMAL_INTEGER	0[xX][0-9a-fA-F]+[uU]?
 }
 
 	/* When skipping (due to an #if 0 or similar) consume anything
-	 * up to a newline. We do this less priroty than any
+	 * up to a newline. We do this with less priority than any
 	 * #if-related directive (#if, #elif, #else, #endif), but with
 	 * more priority than any other directive or token to avoid
 	 * any side-effects from skipped content.
diff --git a/src/glsl/glcpp/tests/067-nested-ifdef-ifndef.c b/src/glsl/glcpp/tests/067-nested-ifdef-ifndef.c
new file mode 100644
index 0000000..f46cce4
--- /dev/null
+++ b/src/glsl/glcpp/tests/067-nested-ifdef-ifndef.c
@@ -0,0 +1,40 @@
+#define D1
+#define D2
+
+#define result success
+
+#ifdef U1
+#ifdef U2
+#undef result
+#define result failure
+#endif
+#endif
+result
+
+#ifndef D1
+#ifndef D2
+#undef result
+#define result failure
+#endif
+#endif
+result
+
+#undef result
+#define result failure
+#ifdef D1
+#ifdef D2
+#undef result
+#define result success
+#endif
+#endif
+result
+
+#undef result
+#define result failure
+#ifndef U1
+#ifndef U2
+#undef result
+#define result success
+#endif
+#endif
+result
diff --git a/src/glsl/glcpp/tests/067-nested-ifdef-ifndef.c.expected b/src/glsl/glcpp/tests/067-nested-ifdef-ifndef.c.expected
new file mode 100644
index 0000000..3340daa
--- /dev/null
+++ b/src/glsl/glcpp/tests/067-nested-ifdef-ifndef.c.expected
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+success
+
+
+
+
+
+
+
+success
+
+
+
+
+
+
+
+
+
+success
+
+
+
+
+
+
+
+
+
+success
+




More information about the mesa-commit mailing list