OSDN Git Service

* cp-demangle.c (status_allocation_failed): Rearrange whitespace.
authorsamuel <samuel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Sep 2000 05:44:46 +0000 (05:44 +0000)
committersamuel <samuel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Sep 2000 05:44:46 +0000 (05:44 +0000)
(demangle_type): Handle substitution candidates correctly in the
face of special substitutions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36228 138bc75d-0d04-0410-961f-82ee72b054a4

libiberty/ChangeLog
libiberty/cp-demangle.c

index fd7f555..597e840 100644 (file)
@@ -1,3 +1,9 @@
+2000-09-06  Alex Samuel  <samuel@codesourcery.com>
+
+       * cp-demangle.c (status_allocation_failed): Rearrange whitespace.
+       (demangle_type): Handle substitution candidates correctly in the
+       face of special substitutions.
+
 2000-09-05  Alex Samuel  <samuel@codesourcery.com>
 
        * cp-demangle.c (demangle_encoding): Rename variable.
index 48325e6..5b16c4e 100644 (file)
@@ -170,7 +170,7 @@ typedef const char *status_t;
 #define STATUS_INTERNAL_ERROR           "Internal error."
 
 /* This status code indicates a failure in malloc or realloc.  */
-static const charconst status_allocation_failed = "Allocation failed.";
+static const char *const status_allocation_failed = "Allocation failed.";
 #define STATUS_ALLOCATION_FAILED        status_allocation_failed
 
 /* Non-zero if STATUS indicates that no error has occurred.  */
@@ -2284,10 +2284,31 @@ demangle_type (dm)
              is_substitution_candidate = 0;
          }
        else
-         /* While the special substitution token itself is not a
-            substitution candidate, the <class-enum-type> is, so
-            don't clear is_substitution_candidate.  */
-         RETURN_IF_ERROR (demangle_class_enum_type (dm, &encode_return_type));
+         {
+           /* Now some trickiness.  We have a special substitution
+              here.  Often, the special substitution provides the
+              name of a template that's subsequently instantiated,
+              for instance `SaIcE' => std::allocator<char>.  In these
+              cases we need to add a substitution candidate for the
+              entire <class-enum-type> and thus don't want to clear
+              the is_substitution_candidate flag.
+
+              However, it's possible that what we have here is a
+              substitution token representing an entire type, such as
+              `Ss' => std::string.  In this case, we mustn't add a
+              new substitution candidate for this substitution token.
+              To detect this case, remember where the start of the
+              substitution token is.  */
+           const char *next = dm->next;
+           /* Now demangle the <class-enum-type>.  */
+           RETURN_IF_ERROR 
+             (demangle_class_enum_type (dm, &encode_return_type));
+           /* If all that was just demangled is the two-character
+              special substitution token, supress the addition of a
+              new candidate for it.  */
+           if (dm->next == next + 2)
+             is_substitution_candidate = 0;
+         }
 
        break;