summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2010-05-27 10:12:33 -0700
committerCarl Worth <cworth@cworth.org>2010-05-27 10:12:33 -0700
commitdd7490093d84ce74a99922c3544b51c3f5d43345 (patch)
treeecc7396fb756ef5920c5d371da31570bff354b72
parent7db2402a8009772a3f10d19cfc7f30be9ee79295 (diff)
Avoid treating an expanded comma as an argument separator.
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).
-rw-r--r--glcpp-parse.y18
-rw-r--r--tests/056-macro-argument-with-comma.c4
2 files changed, 20 insertions, 2 deletions
diff --git a/glcpp-parse.y b/glcpp-parse.y
index abdcd1e..b2684d0 100644
--- a/glcpp-parse.y
+++ b/glcpp-parse.y
@@ -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
index 0000000..58701d1
--- /dev/null
+++ b/tests/056-macro-argument-with-comma.c
@@ -0,0 +1,4 @@
+#define bar with,embedded,commas
+#define function(x) success
+#define foo function
+foo(bar)