cpplib.c (macroexpand): If arg->raw_before or arg->raw_after...
authorZack Weinberg <zack@rabi.phys.columbia.edu>
Wed, 30 Sep 1998 19:27:28 +0000 (19:27 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 30 Sep 1998 19:27:28 +0000 (13:27 -0600)
        * 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
gcc/cpplib.c

index c435e08d11fed68e19671e84895bfb62e8e8cea2..4e5ea59e08f3b63be600cdad979dbd4261108d99 100644 (file)
@@ -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  <zack@rabi.phys.columbia.edu>  
 
+       * 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
index c605a4a9b9caec12a303f5477fdb0caf4b575ba3..b37a779819cc1a0b3d613bde7185f5cc6d9abbd6 100644 (file)
@@ -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;
            }