Avoid treating an expanded comma as an argument separator.
authorCarl Worth <cworth@cworth.org>
Thu, 27 May 2010 17:12:33 +0000 (10:12 -0700)
committerCarl Worth <cworth@cworth.org>
Thu, 27 May 2010 17:12:33 +0000 (10:12 -0700)
That is, a function-like invocation foo(x) is valid as a
single-argument invocation even if 'x' is a macro that expands into a
value with a comma. Add a new COMMA_FINAL token type to handle this,
and add a test for this case, (which passes).

glcpp-parse.y
tests/056-macro-argument-with-comma.c [new file with mode: 0644]

index abdcd1ed5d84368f5fb0a013922c7d961b388ac7..b2684d06d98a3b0070430763251658766fc6f508 100644 (file)
@@ -132,7 +132,7 @@ glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list);
 %parse-param {glcpp_parser_t *parser}
 %lex-param {glcpp_parser_t *parser}
 
-%token DEFINED ELIF_EXPANDED HASH HASH_DEFINE_FUNC HASH_DEFINE_OBJ HASH_ELIF HASH_ELSE HASH_ENDIF HASH_IF HASH_IFDEF HASH_IFNDEF HASH_UNDEF IDENTIFIER IF_EXPANDED INTEGER NEWLINE OTHER SPACE
+%token COMMA_FINAL DEFINED ELIF_EXPANDED HASH HASH_DEFINE_FUNC HASH_DEFINE_OBJ HASH_ELIF HASH_ELSE HASH_ENDIF HASH_IF HASH_IFDEF HASH_IFNDEF HASH_UNDEF IDENTIFIER IF_EXPANDED INTEGER NEWLINE OTHER SPACE
 %token PASTE
 %type <ival> expression INTEGER operator SPACE
 %type <str> IDENTIFIER OTHER
@@ -740,6 +740,9 @@ _token_print (token_t *token)
        case PASTE:
                printf ("##");
                break;
+       case COMMA_FINAL:
+               printf (",");
+               break;
        default:
                fprintf (stderr, "Error: Don't know how to print token type %d\n", token->type);
                break;
@@ -936,7 +939,18 @@ _expand_token_onto (glcpp_parser_t *parser,
 
        /* We only expand identifiers */
        if (token->type != IDENTIFIER) {
-               _token_list_append (result, token);
+               /* We change any COMMA into a COMMA_FINAL to prevent
+                * it being mistaken for an argument separator
+                * later. */
+               if (token->type == ',') {
+                       token_t *new_token;
+
+                       new_token = _token_create_ival (result, COMMA_FINAL,
+                                                       COMMA_FINAL);
+                       _token_list_append (result, new_token);
+               } else {
+                       _token_list_append (result, token);
+               }
                return 0;
        }
 
diff --git a/tests/056-macro-argument-with-comma.c b/tests/056-macro-argument-with-comma.c
new file mode 100644 (file)
index 0000000..58701d1
--- /dev/null
@@ -0,0 +1,4 @@
+#define bar with,embedded,commas
+#define function(x) success
+#define foo function
+foo(bar)