Remove redundant test in BFD_ASSERT
[deliverable/binutils-gdb.git] / libiberty / cplus-dem.c
index af35bc1311987b09bc6937c2876d437b662e4f47..60a54844c23954362331dca10a48dc0f1b8f606a 100644 (file)
@@ -1,6 +1,6 @@
 /* Demangler for GNU C++
    Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001 Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
    Written by James Clark (jjc@jclark.uucp)
    Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
    Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
@@ -976,7 +976,6 @@ ada_demangle (mangled, option)
   int len0;
   const char* p;
   char *demangled = NULL;
-  int at_start_name;
   int changed;
   size_t demangled_size = 0;
   
@@ -1029,15 +1028,12 @@ ada_demangle (mangled, option)
        i += 1, j += 1)
     demangled[j] = mangled[i];
   
-  at_start_name = 1;
   while (i < len0)
     {
-      at_start_name = 0;
-      
       if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_')
        {
          demangled[j] = '.';
-         changed = at_start_name = 1;
+         changed = 1;
          i += 2; j += 1;
        }
       else
@@ -1797,31 +1793,34 @@ demangle_integral_value (work, mangled, s)
 
       success = 0;
 
-      /* Negative numbers are indicated with a leading `m'.  */
-      if (**mangled == 'm')
-       {
-         string_appendn (s, "-", 1);
-         (*mangled)++;
-       }
-      else if (mangled[0][0] == '_' && mangled[0][1] == 'm')
-       {
-         /* Since consume_count_with_underscores does not handle the
-            `m'-prefix we must do it here, using consume_count and
-            adjusting underscores: we have to consume the underscore
-            matching the prepended one.  */
-         multidigit_without_leading_underscore = 1;
-         string_appendn (s, "-", 1);
-         (*mangled) += 2;
-       }
-      else if (**mangled == '_')
-       {
-         /* Do not consume a following underscore;
-            multidigit_without_leading_underscore will consume what should be
-            consumed.  */
-         leave_following_underscore = 1;
+      if (**mangled == '_')
+        {
+         if (mangled[0][1] == 'm')
+           {
+             /* Since consume_count_with_underscores does not handle the
+                `m'-prefix we must do it here, using consume_count and
+                adjusting underscores: we have to consume the underscore
+                matching the prepended one.  */
+             multidigit_without_leading_underscore = 1;
+             string_appendn (s, "-", 1);
+             (*mangled) += 2;
+           }
+         else
+           {
+             /* Do not consume a following underscore;
+                consume_count_with_underscores will consume what
+                should be consumed.  */
+             leave_following_underscore = 1;
+           }
        }
       else
        {
+         /* Negative numbers are indicated with a leading `m'.  */
+         if (**mangled == 'm')
+         {
+           string_appendn (s, "-", 1);
+           (*mangled)++;
+         }
          /* Since consume_count_with_underscores does not handle
             multi-digit numbers that do not start with an underscore,
             and this number can be an integer template parameter,
@@ -1862,7 +1861,7 @@ demangle_integral_value (work, mangled, s)
          /* All is well.  */
          success = 1;
        }
-    }
+      }
 
   return success;
 }
@@ -2037,17 +2036,12 @@ demangle_template (work, mangled, tname, trawname, is_type, remember)
   int r;
   int need_comma = 0;
   int success = 0;
-  const char *start;
   int is_java_array = 0;
   string temp;
-  int bindex = 0;
 
   (*mangled)++;
   if (is_type)
     {
-      if (remember)
-       bindex = register_Btype (work);
-      start = *mangled;
       /* get template name */
       if (**mangled == 'z')
        {
@@ -2223,7 +2217,10 @@ demangle_template (work, mangled, tname, trawname, is_type, remember)
     }
 
   if (is_type && remember)
-    remember_Btype (work, tname->b, LEN_STRING (tname), bindex);
+    {
+      const int bindex = register_Btype (work);
+      remember_Btype (work, tname->b, LEN_STRING (tname), bindex);
+    }
 
   /*
     if (work -> static_type)
@@ -2315,6 +2312,7 @@ demangle_arm_hp_template (work, mangled, n, declp)
   if (HP_DEMANGLING && ((*mangled)[n] == 'X'))
     {
       char *start_spec_args = NULL;
+      int hold_options;
 
       /* First check for and omit template specialization pseudo-arguments,
          such as in "Spec<#1,#1.*>" */
@@ -2327,6 +2325,12 @@ demangle_arm_hp_template (work, mangled, n, declp)
       string_init (&arg);
       if (work->temp_start == -1) /* non-recursive call */
         work->temp_start = declp->p - declp->b;
+
+      /* We want to unconditionally demangle parameter types in
+        template parameters.  */
+      hold_options = work->options;
+      work->options |= DMGL_PARAMS;
+
       string_append (declp, "<");
       while (1)
         {
@@ -2373,17 +2377,25 @@ demangle_arm_hp_template (work, mangled, n, declp)
       string_delete (&arg);
       if (**mangled == '_')
         (*mangled)++;
+      work->options = hold_options;
       return;
     }
   /* ARM template? (Also handles HP cfront extensions) */
   else if (arm_pt (work, *mangled, n, &p, &args))
     {
+      int hold_options;
       string type_str;
 
       string_init (&arg);
       string_appendn (declp, *mangled, p - *mangled);
       if (work->temp_start == -1)  /* non-recursive call */
        work->temp_start = declp->p - declp->b;
+
+      /* We want to unconditionally demangle parameter types in
+        template parameters.  */
+      hold_options = work->options;
+      work->options |= DMGL_PARAMS;
+
       string_append (declp, "<");
       /* should do error checking here */
       while (args < e) {
@@ -2427,7 +2439,10 @@ demangle_arm_hp_template (work, mangled, n, declp)
 
               /* Fail if we didn't make any progress: prevent infinite loop. */
               if (args == old_args)
-                return;
+               {
+                 work->options = hold_options;
+                 return;
+               }
             }
          }
        string_appends (declp, &arg);
@@ -2438,6 +2453,7 @@ demangle_arm_hp_template (work, mangled, n, declp)
       if (args >= e)
        --declp->p; /* remove extra comma */
       string_append (declp, ">");
+      work->options = hold_options;
     }
   else if (n>10 && strncmp (*mangled, "_GLOBAL_", 8) == 0
           && (*mangled)[9] == 'N'
This page took 0.025615 seconds and 4 git commands to generate.