glcpp: Fix function-like macros with an argument used multiple times.
authorCarl Worth <cworth@cworth.org>
Thu, 22 Jul 2010 23:36:04 +0000 (16:36 -0700)
committerCarl Worth <cworth@cworth.org>
Thu, 22 Jul 2010 23:38:12 +0000 (16:38 -0700)
It's really hard to believe that this case has been broken, but apparently
no test previously exercised it. So this commit adds such a test and fixes
it by making a copy of the argument token-list before expanding it.

This fix causes the following glean tests to now pass:

glsl1-Preprocessor test 6 (#if 0, #define macro)
glsl1-Preprocessor test 7 (multi-line #define)

src/glsl/glcpp/glcpp-parse.y
src/glsl/glcpp/tests/069-repeated-argument.c [new file with mode: 0644]

index e4dcc76e0a7f501ec5cb5d9609f351c000dfebb1..5b7467836d7258540fbf21462834a26a3847ed41 100644 (file)
@@ -1075,7 +1075,7 @@ _token_list_create_with_one_space (void *ctx)
  *
  * Returns the token list that results from the expansion and sets
  * *last to the last node in the list that was consumed by the
- * expansion. Specificallty, *last will be set as follows: as the
+ * expansion. Specifically, *last will be set as follows: as the
  * token of the closing right parenthesis.
  */
 static token_list_t *
@@ -1147,9 +1147,13 @@ _glcpp_parser_expand_function (glcpp_parser_t *parser,
                         * tokens, or append a placeholder token for
                         * an empty argument. */
                        if (argument->head) {
+                               token_list_t *expanded_argument;
+                               expanded_argument = _token_list_copy (parser,
+                                                                     argument);
                                _glcpp_parser_expand_token_list (parser,
-                                                                argument);
-                               _token_list_append_list (substituted, argument);
+                                                                expanded_argument);
+                               _token_list_append_list (substituted,
+                                                        expanded_argument);
                        } else {
                                token_t *new_token;
 
diff --git a/src/glsl/glcpp/tests/069-repeated-argument.c b/src/glsl/glcpp/tests/069-repeated-argument.c
new file mode 100644 (file)
index 0000000..2b46ead
--- /dev/null
@@ -0,0 +1,2 @@
+#define double(x) x x
+double(1)