summaryrefslogtreecommitdiffstats
path: root/src/glsl/glcpp
diff options
context:
space:
mode:
authorCarl Worth <[email protected]>2010-07-22 16:36:04 -0700
committerCarl Worth <[email protected]>2010-07-22 16:38:12 -0700
commitfbe4240626bfe102a9c4c889ee18cb9ea27bddec (patch)
treedf8e7fdcfc73a32972a2605e5c9db248f86b9f41 /src/glsl/glcpp
parenta0879b9dd438d78635f047cdd5ed4c72bc831b60 (diff)
glcpp: Fix function-like macros with an argument used multiple times.
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)
Diffstat (limited to 'src/glsl/glcpp')
-rw-r--r--src/glsl/glcpp/glcpp-parse.y10
-rw-r--r--src/glsl/glcpp/tests/069-repeated-argument.c2
2 files changed, 9 insertions, 3 deletions
diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
index e4dcc76e0a7..5b7467836d7 100644
--- a/src/glsl/glcpp/glcpp-parse.y
+++ b/src/glsl/glcpp/glcpp-parse.y
@@ -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
index 00000000000..2b46ead294c
--- /dev/null
+++ b/src/glsl/glcpp/tests/069-repeated-argument.c
@@ -0,0 +1,2 @@
+#define double(x) x x
+double(1)