cpphash.c (_cpp_cleanup_hashtable, [...]): Don't set fe_value.
authorNeil Booth <neil@daikokuya.demon.co.uk>
Sun, 28 Jan 2001 11:22:23 +0000 (11:22 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Sun, 28 Jan 2001 11:22:23 +0000 (11:22 +0000)
        * cpphash.c (_cpp_cleanup_hashtable, _cpp_lookup_with_hash)
        : Don't set fe_value.
        * cpplib.h (AVOID_LPASTE): New flag.
        (struct cpp_hashnode): Remove fe_value.
        * cpplex.c (cpp_avoid_paste): Don't paste '.' with a number.
        * cppmacro.c (builtin_macro): Don't set flags here.
        (replace_args): Set AVOID_LPASTE flag on first token of an
        argument, and the token following it.
        (cpp_get_token): Set AVOID_LPASTE flag on first token of a
        macro expansion, and on the token following it.  Do it for
        builtins too.
        * cppmain.c (scan_buffer): Avoid pasting only flagged tokens.

From-SVN: r39318

gcc/ChangeLog
gcc/cpphash.c
gcc/cpplex.c
gcc/cpplib.h
gcc/cppmacro.c
gcc/cppmain.c

index ecbe833..90f2f06 100644 (file)
@@ -1,3 +1,18 @@
+2001-01-28  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+        * cpphash.c (_cpp_cleanup_hashtable, _cpp_lookup_with_hash)
+        : Don't set fe_value.
+        * cpplib.h (AVOID_LPASTE): New flag. 
+        (struct cpp_hashnode): Remove fe_value.
+        * cpplex.c (cpp_avoid_paste): Don't paste '.' with a number.
+        * cppmacro.c (builtin_macro): Don't set flags here.
+        (replace_args): Set AVOID_LPASTE flag on first token of an
+        argument, and the token following it.
+        (cpp_get_token): Set AVOID_LPASTE flag on first token of a
+        macro expansion, and on the token following it.  Do it for
+        builtins too.
+        * cppmain.c (scan_buffer): Avoid pasting only flagged tokens.
+
 2001-01-27  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/t-ieee: Remove multilibbing.
index 4804c8f..d4c9e37 100644 (file)
@@ -73,10 +73,7 @@ _cpp_cleanup_hashtable (pfile)
   do
     {
       if (*p)
-       {
-         _cpp_free_definition (*p);
-         (*p)->fe_value = 0;  /* expose the node to GC */
-       }
+       _cpp_free_definition (*p);
     }
   while (++p < limit);
 
@@ -169,7 +166,6 @@ _cpp_lookup_with_hash (pfile, len, hash)
   entry = entries[index];
   entry->type = NT_VOID;
   entry->flags = 0;
-  entry->fe_value = 0;
   entry->directive_index = 0;
   entry->arg_index = 0;
   entry->length = len;
index 1dc401e..f9431f8 100644 (file)
@@ -1656,7 +1656,7 @@ cpp_avoid_paste (pfile, token1, token2)
     case CPP_OR:       return c == '|';
     case CPP_COLON:    return c == ':' || c == '>';
     case CPP_DEREF:    return c == '*';
-    case CPP_DOT:      return c == '.' || c == '%';
+    case CPP_DOT:      return c == '.' || c == '%' || b == CPP_NUMBER;
     case CPP_HASH:     return c == '#' || c == '%'; /* Digraph form.  */
     case CPP_NAME:     return ((b == CPP_NUMBER
                                 && name_p (pfile, &token2->val.str))
index c109a0f..9d0b8e2 100644 (file)
@@ -166,6 +166,7 @@ struct cpp_string
 #define PASTE_LEFT     (1 << 3) /* If on LHS of a ## operator.  */
 #define NAMED_OP       (1 << 4) /* C++ named operators.  */
 #define NO_EXPAND      (1 << 5) /* Do not macro-expand this token.  */
+#define AVOID_LPASTE   (1 << 6) /* Check left for accidental pastes.  */
 
 /* A preprocessing token.  This has been carefully packed and should
    occupy 12 bytes on 32-bit hosts and 16 bytes on 64-bit hosts.  */
@@ -487,8 +488,6 @@ struct cpp_hashnode
     enum cpp_ttype operator;           /* Code for a named operator.  */
     enum builtin_type builtin;         /* Code for a builtin macro.  */
   } value;
-
-  union tree_node *fe_value;           /* Front end value.  */
 };
 
 /* Call this first to get a handle to pass to other functions.  */
index a7d71a0..aea7e5d 100644 (file)
@@ -146,7 +146,6 @@ builtin_macro (pfile, token)
      cpp_reader *pfile;
      cpp_token *token;
 {
-  unsigned char flags = token->flags & PREV_WHITE;
   cpp_hashnode *node = token->val.node;
 
   switch (node->value.builtin)
@@ -220,8 +219,6 @@ builtin_macro (pfile, token)
       cpp_ice (pfile, "invalid builtin macro \"%s\"", node->name);
       break;
     }
-
-  token->flags = flags;
 }
 
 /* Used by cpperror.c to obtain the correct line and column to report
@@ -671,13 +668,13 @@ enter_macro_context (pfile, node)
       list.limit = macro->expansion + macro->count;
     }
 
+  /* Only push a macro context for non-empty replacement lists.  */
   if (list.first != list.limit)
     {
-      /* Push its context.  */
       context = next_context (pfile);
       context->list = list;
       context->macro = macro;
-
+      
       /* Disable the macro within its expansion.  */
       macro->disabled = 1;
     }
@@ -712,6 +709,7 @@ replace_args (pfile, macro, args, list)
      macro_arg *args;
      struct toklist *list;
 {
+  unsigned char flags = 0;
   unsigned int i, total;
   const cpp_token *src, *limit;
   cpp_token *dest;
@@ -804,11 +802,20 @@ replace_args (pfile, macro, args, list)
            /* The last token gets the PASTE_LEFT of the CPP_MACRO_ARG.  */
            dest[count - 1].flags |= src->flags & PASTE_LEFT;
 
+           dest[0].flags |= AVOID_LPASTE;
            dest += count;
          }
+
+       /* The token after the argument must avoid an accidental paste.  */
+       flags = AVOID_LPASTE;
       }
     else
-      *dest++ = *src;
+      {
+       *dest = *src;
+       dest->flags |= flags;
+       dest++;
+       flags = 0;
+      }
 
   list->limit = dest;
 
@@ -913,8 +920,6 @@ cpp_get_token (pfile, token)
       else if (context->list.first != context->list.limit)
        {
          *token = *context->list.first++;
-         token->flags |= flags;
-         flags = 0;
          /* PASTE_LEFT tokens can only appear in macro expansions.  */
          if (token->flags & PASTE_LEFT)
            paste_all_tokens (pfile, token);
@@ -923,6 +928,8 @@ cpp_get_token (pfile, token)
        {
          if (context->macro)
            {
+             /* Avoid accidental paste at the end of a macro.  */
+             flags |= AVOID_LPASTE;
              _cpp_pop_context (pfile);
              continue;
            }
@@ -932,6 +939,8 @@ cpp_get_token (pfile, token)
          return;
        }
 
+      token->flags |= flags;
+      flags = 0;
       if (token->type != CPP_NAME)
        break;
 
@@ -945,15 +954,16 @@ cpp_get_token (pfile, token)
          /* Macros invalidate controlling macros.  */
          pfile->mi_state = MI_FAILED;
 
+         /* Remember PREV_WHITE and avoid an accidental paste.  */
+         flags = (token->flags & PREV_WHITE) | AVOID_LPASTE;
+
          if (node->flags & NODE_BUILTIN)
            {
              builtin_macro (pfile, token);
+             token->flags = flags;
              break;
            }
 
-         /* Merge PREV_WHITE of tokens.  */
-         flags = token->flags & PREV_WHITE;
-
          if (node->value.macro->disabled)
            token->flags |= NO_EXPAND;
          else if (enter_macro_context (pfile, node))
index ecc27e4..13bbbdd 100644 (file)
@@ -235,8 +235,8 @@ scan_buffer (pfile)
                }
            }
          else if (print.printed
-                  && ! (token->flags & PREV_WHITE)
-                  && options->lang != CLK_ASM
+                  && (token->flags & (PREV_WHITE | AVOID_LPASTE))
+                      == AVOID_LPASTE
                   && cpp_avoid_paste (pfile, &tokens[1 - index], token))
            token->flags |= PREV_WHITE;