diff --git a/tccpp.c b/tccpp.c index 33c65a4..779aa42 100644 --- a/tccpp.c +++ b/tccpp.c @@ -2788,7 +2788,7 @@ static inline int *macro_twosharps(const int *macro_str) CValue cval; TokenString macro_str1; CString cstr; - int n; + int n, start_of_nosubsts; /* we search the first '##' */ for(ptr = macro_str;;) { @@ -2801,6 +2801,7 @@ static inline int *macro_twosharps(const int *macro_str) } /* we saw '##', so we need more processing to handle it */ + start_of_nosubsts = -1; tok_str_new(¯o_str1); for(ptr = macro_str;;) { TOK_GET(&tok, &ptr, &tokc); @@ -2808,8 +2809,17 @@ static inline int *macro_twosharps(const int *macro_str) break; if (tok == TOK_TWOSHARPS) continue; + if (tok == TOK_NOSUBST && start_of_nosubsts < 0) + start_of_nosubsts = macro_str1.len; while (*ptr == TOK_TWOSHARPS) { - do { t = *++ptr; } while (t == TOK_NOSUBST); + /* given 'a##b', remove nosubsts preceding 'a' */ + if (start_of_nosubsts >= 0) + macro_str1.len = start_of_nosubsts; + /* given 'a##b', skip '##' */ + t = *++ptr; + /* given 'a##b', remove nosubsts preceding 'b' */ + while (t == TOK_NOSUBST) + t = *++ptr; if (t && t != TOK_TWOSHARPS) { TOK_GET(&t, &ptr, &cval); @@ -2835,6 +2845,8 @@ static inline int *macro_twosharps(const int *macro_str) cstr_reset(&cstr); } } + if (tok != TOK_NOSUBST) + start_of_nosubsts = -1; tok_str_add2(¯o_str1, tok, &tokc); } tok_str_add(¯o_str1, 0); diff --git a/tests/tcctest.c b/tests/tcctest.c index 22f3fdb..980b436 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -103,6 +103,10 @@ int isid(int c); #define HIGHLOW "hello" #define LOW LOW ", world" +static int onetwothree = 123; +#define onetwothree4 onetwothree +#define onetwothree xglue(onetwothree,4) + #define min(a, b) ((a) < (b) ? (a) : (b)) #ifdef C99_MACROS @@ -155,6 +159,8 @@ void macro_test(void) printf("s4=%s\n", str(a1)); printf("B3=%d\n", B3); + printf("onetwothree=%d\n", onetwothree); + #ifdef A printf("A defined\n"); #endif