bug:
authorjiang <30155751@qq.com>
Sun, 29 Jun 2014 12:35:57 +0000 (29 20:35 +0800)
committerjiang <30155751@qq.com>
Sun, 29 Jun 2014 12:35:57 +0000 (29 20:35 +0800)
----------------------------------------------------------------------
#define hexCh(c (c >= 10 ? 'a' + c - 10 : '0' + c)
  hexCh(c);

out:
jiang@jiang:~/test$ ./tcc -E c4.c
# 1 "c4.c"

(c >= 10 ? 'a' + c - 10 : '0' + c);
---------------------------------------------------------------

#define hexCh(c/3) (c >= 10 ? 'a' + c - 10 : '0' + c)
hexCh(c);

out:
jiang@jiang:~/test$ ./tcc -E c4.c
# 1 "c4.c"

/3) (c >= 10 ? 'a' + c - 10 : '0' + c);
jiang@jiang:~/test$

after patch:

# 1 "c4.c"
c4.c:1: error: may not appear in macro parameter list: "("
jiang@jiang:~/test$

jiang@jiang:~/test$ ./tcc -E c4.c
# 1 "c4.c"
c4.c:1: error: may not appear in macro parameter list: "/"
jiang@jiang:~/test$

tccpp.c
tests/tests2/68_macro_concat.c [new file with mode: 0644]
tests/tests2/68_macro_concat.expect [new file with mode: 0644]
tests/tests2/69_macro_concat.c [new file with mode: 0644]
tests/tests2/69_macro_concat.expect [new file with mode: 0644]
tests/tests2/Makefile

diff --git a/tccpp.c b/tccpp.c
index 2da65cd..0cea7cf 100644 (file)
--- a/tccpp.c
+++ b/tccpp.c
@@ -1239,16 +1239,15 @@ ST_FUNC void parse_define(void)
                 next_nomacro();
             }
             if (varg < TOK_IDENT)
-                tcc_error("badly punctuated parameter list");
+                tcc_error( "\'%s\' may not appear in parameter list", get_tok_str(varg, NULL));
             s = sym_push2(&define_stack, varg | SYM_FIELD, is_vaargs, 0);
             *ps = s;
             ps = &s->next;
             if (tok != ',')
-                break;
+                continue;
             next_nomacro();
         }
-        if (tok == ')')
-            next_nomacro_spc();
+        next_nomacro_spc();
         t = MACRO_FUNC;
     }
     tok_str_new(&str);
diff --git a/tests/tests2/68_macro_concat.c b/tests/tests2/68_macro_concat.c
new file mode 100644 (file)
index 0000000..5c1361f
--- /dev/null
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#define hexCh(c (c >= 10 ? 'a' + c - 10 : '0' + c)
+
+int main(void)
+{
+    int c = 0xa; 
+    printf("hex: %c\n", hexCh(c));
+    return 0;
+}
diff --git a/tests/tests2/68_macro_concat.expect b/tests/tests2/68_macro_concat.expect
new file mode 100644 (file)
index 0000000..0bf7d54
--- /dev/null
@@ -0,0 +1 @@
+68_macro_concat.c:2: error: '(' may not appear in parameter list
diff --git a/tests/tests2/69_macro_concat.c b/tests/tests2/69_macro_concat.c
new file mode 100644 (file)
index 0000000..3b16313
--- /dev/null
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#define hexCh(c/3) (c >= 10 ? 'a' + c - 10 : '0' + c)
+
+int main(void)
+{
+    int c = 0xa; 
+    printf("hex: %c\n", hexCh(c));
+    return 0;
+}
diff --git a/tests/tests2/69_macro_concat.expect b/tests/tests2/69_macro_concat.expect
new file mode 100644 (file)
index 0000000..89e7b79
--- /dev/null
@@ -0,0 +1 @@
+69_macro_concat.c:2: error: '/' may not appear in parameter list
index c47fe0a..64532a1 100644 (file)
@@ -82,7 +82,9 @@ TESTS =       \
  64_macro_nesting.test \
  65_macro_concat_start.test \
  66_macro_concat_end.test \
- 67_macro_concat.test
+ 67_macro_concat.test \
+ 68_macro_concat.test \
+ 69_macro_concat.test
 
 # 34_array_assignment.test -- array assignment is not in C standard