cpphash.c (collect_expansion): Also catch ## at start of macro.
authorJason Merrill <jason@casey.cygnus.com>
Tue, 7 Mar 2000 08:34:34 +0000 (08:34 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 7 Mar 2000 08:34:34 +0000 (03:34 -0500)
        * cpphash.c (collect_expansion): Also catch ## at start of macro.

        * varasm.c (make_decl_rtl): Don't add a number to members of
        local classes.
        (make_function_rtl): Likewise.

From-SVN: r32378

gcc/ChangeLog
gcc/cpphash.c
gcc/varasm.c

index 57b863a..cce837f 100644 (file)
@@ -1,3 +1,11 @@
+2000-03-06  Jason Merrill  <jason@casey.cygnus.com>
+
+       * cpphash.c (collect_expansion): Also catch ## at start of macro.
+
+       * varasm.c (make_decl_rtl): Don't add a number to members of
+       local classes.
+       (make_function_rtl): Likewise.
+
 2000-03-06  Alexandre Oliva  <oliva@lsd.ic.unicamp.br>
 
        * gcse.c (compute_can_copy): Adjust if/else blocks from rth's
index bb772eb..bcb5538 100644 (file)
@@ -346,6 +346,8 @@ collect_expansion (pfile, arglist)
          else if (last_token == PASTE)
            /* ## ## - the second ## is ordinary.  */
            goto norm;
+         else if (last_token == START)
+           cpp_error (pfile, "`##' at start of macro definition");
          
          /* Discard the token and any hspace before it.  */
          while (is_hspace (pfile->token_buffer[here-1]))
index 751ce82..baf06e0 100644 (file)
@@ -522,8 +522,10 @@ make_function_rtl (decl)
   char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
   char *new_name = name;
 
-  /* Rename a nested function to avoid conflicts.  */
+  /* Rename a nested function to avoid conflicts, unless it's a member of
+     a local class, in which case the class name is already unique.  */
   if (decl_function_context (decl) != 0
+      && ! TYPE_P (DECL_CONTEXT (decl))
       && DECL_INITIAL (decl) != 0
       && DECL_RTL (decl) == 0)
     {
@@ -765,9 +767,12 @@ make_decl_rtl (decl, asmspec, top_level)
       if (DECL_RTL (decl) == 0)
        {
          /* Can't use just the variable's own name for a variable
-            whose scope is less than the whole file.
+            whose scope is less than the whole file, unless it's a member
+            of a local class (which will already be unambiguous).
             Concatenate a distinguishing number.  */
-         if (!top_level && !TREE_PUBLIC (decl) && asmspec == 0)
+         if (!top_level && !TREE_PUBLIC (decl)
+             && ! TYPE_P (DECL_CONTEXT (decl))
+             && asmspec == 0)
            {
              char *label;