From aa90b11170630993a99b1e18190e9f0a8e7b2265 Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Wed, 30 Sep 1998 19:27:28 +0000 Subject: [PATCH] cpplib.c (macroexpand): If arg->raw_before or arg->raw_after... * cpplib.c (macroexpand): If arg->raw_before or arg->raw_after, remove any no-reexpansion escape at the beginning of the pasted token. Correct handling of whitespace markers and no-reexpand markers at the end if arg->raw_after. From-SVN: r22695 --- gcc/ChangeLog | 5 +++++ gcc/cpplib.c | 34 +++++++++++++++++++++++----------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c435e08d11f..4e5ea59e08f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -6,6 +6,11 @@ Wed Sep 30 19:33:07 1998 Jeffrey A Law (law@cygnus.com) Wed Sep 30 19:13:20 1998 Zack Weinberg + * cpplib.c (macroexpand): If arg->raw_before or + arg->raw_after, remove any no-reexpansion escape at the + beginning of the pasted token. Correct handling of whitespace + markers and no-reexpand markers at the end if arg->raw_after. + * toplev.c (documented_lang_options): Recognize -include, -imacros, -iwithprefix, -iwithprefixbefore. * cpplib.c (cpp_start_read): Process -imacros and -include diff --git a/gcc/cpplib.c b/gcc/cpplib.c index c605a4a9b9c..b37a779819c 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -2874,11 +2874,6 @@ macroexpand (pfile, hp) while (p1 != l1 && is_space[*p1]) p1++; while (p1 != l1 && is_idchar[*p1]) xbuf[totlen++] = *p1++; - /* Delete any no-reexpansion marker that follows - an identifier at the beginning of the argument - if the argument is concatenated with what precedes it. */ - if (p1[0] == '@' && p1[1] == '-') - p1 += 2; } if (ap->raw_after) { @@ -2887,21 +2882,38 @@ macroexpand (pfile, hp) while (p1 != l1) { if (is_space[l1[-1]]) l1--; + else if (l1[-1] == '@') + { + U_CHAR *p2 = l1 - 1; + /* If whitespace is preceded by an odd number + of `@' signs, the last `@' was a whitespace + marker; drop it too. */ + while (p2 != p1 && p2[-1] == '@') p2--; + if ((l1 - 1 - p2) & 1) + l1--; + break; + } else if (l1[-1] == '-') { U_CHAR *p2 = l1 - 1; - /* If a `-' is preceded by an odd number of newlines then it - and the last newline are a no-reexpansion marker. */ - while (p2 != p1 && p2[-1] == '\n') p2--; - if ((l1 - 1 - p2) & 1) { + /* If a `-' is preceded by an odd number of + `@' signs then it and the last `@' are + a no-reexpansion marker. */ + while (p2 != p1 && p2[-1] == '@') p2--; + if ((l1 - 1 - p2) & 1) l1 -= 2; - } - else break; + else + break; } else break; } } + /* Delete any no-reexpansion marker that precedes + an identifier at the beginning of the argument. */ + if (p1[0] == '@' && p1[1] == '-') + p1 += 2; + bcopy (p1, xbuf + totlen, l1 - p1); totlen += l1 - p1; } -- 2.30.2