fix self-referential token pasting

master
Joe Soroka 2011-07-08 02:51:06 -07:00
parent 5cf5871aaf
commit 38756b506f
2 changed files with 20 additions and 2 deletions

16
tccpp.c
View File

@ -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(&macro_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(&macro_str1, tok, &tokc);
}
tok_str_add(&macro_str1, 0);

View File

@ -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