* gas/mmix/list-pseudoints.l: Adjust for changes in gas section
[deliverable/binutils-gdb.git] / libiberty / cplus-dem.c
index 5af8826368629a1fa86b4ad80ba3f42dd23e2720..203e30dba24e01498e55e1c952590eafb51650ee 100644 (file)
@@ -911,7 +911,7 @@ cplus_demangle (mangled, options)
   /* The V3 ABI demangling is implemented elsewhere.  */
   if (GNU_V3_DEMANGLING || AUTO_DEMANGLING)
     {
-      ret = cplus_demangle_v3 (mangled);
+      ret = cplus_demangle_v3 (mangled, work->options);
       if (ret || GNU_V3_DEMANGLING)
        return ret;
     }
@@ -1787,7 +1787,7 @@ demangle_integral_value (work, mangled, s)
 
       /* By default, we let the number decide whether we shall consume an
         underscore.  */
-      int consume_following_underscore = 0;
+      int multidigit_without_leading_underscore = 0;
       int leave_following_underscore = 0;
 
       success = 0;
@@ -1804,23 +1804,34 @@ demangle_integral_value (work, mangled, s)
             `m'-prefix we must do it here, using consume_count and
             adjusting underscores: we have to consume the underscore
             matching the prepended one.  */
-         consume_following_underscore = 1;
+         multidigit_without_leading_underscore = 1;
          string_appendn (s, "-", 1);
          (*mangled) += 2;
        }
       else if (**mangled == '_')
        {
          /* Do not consume a following underscore;
-            consume_following_underscore will consume what should be
+            multidigit_without_leading_underscore will consume what should be
             consumed.  */
          leave_following_underscore = 1;
        }
+      else
+       {
+         /* 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,
+            we have to call consume_count. */
+         multidigit_without_leading_underscore = 1;
+         /* These multi-digit numbers never end on an underscore,
+            so if there is one then don't eat it. */
+         leave_following_underscore = 1;
+       }
 
       /* We must call consume_count if we expect to remove a trailing
         underscore, since consume_count_with_underscores expects
         the leading underscore (that we consumed) if it is to handle
         multi-digit numbers.  */
-      if (consume_following_underscore)
+      if (multidigit_without_leading_underscore)
        value = consume_count (mangled);
       else
        value = consume_count_with_underscores (mangled);
@@ -1838,7 +1849,7 @@ demangle_integral_value (work, mangled, s)
             is wrong.  If other (arbitrary) cases are followed by an
             underscore, we need to do something more radical.  */
 
-         if ((value > 9 || consume_following_underscore)
+         if ((value > 9 || multidigit_without_leading_underscore)
              && ! leave_following_underscore
              && **mangled == '_')
            (*mangled)++;
@@ -2403,8 +2414,15 @@ demangle_arm_hp_template (work, mangled, n, declp)
             break;
           default:
             /* Not handling other HP cfront stuff */
-            if (!do_type (work, &args, &arg))
-              goto cfront_template_args_done;
+            {
+              const char* old_args = args;
+              if (!do_type (work, &args, &arg))
+                goto cfront_template_args_done;
+
+              /* Fail if we didn't make any progress: prevent infinite loop. */
+              if (args == old_args)
+                return;
+            }
          }
        string_appends (declp, &arg);
        string_append (declp, ",");
@@ -4874,7 +4892,7 @@ string_append_template_idx (s, idx)
 
 static const char *program_name;
 static const char *program_version = VERSION;
-static int flags = DMGL_PARAMS | DMGL_ANSI;
+static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
 
 static void demangle_it PARAMS ((char *));
 static void usage PARAMS ((FILE *, int)) ATTRIBUTE_NORETURN;
@@ -4887,7 +4905,8 @@ demangle_it (mangled_name)
 {
   char *result;
 
-  result = cplus_demangle (mangled_name, flags);
+  /* For command line args, also try to demangle type encodings.  */
+  result = cplus_demangle (mangled_name, flags | DMGL_TYPES);
   if (result == NULL)
     {
       printf ("%s\n", mangled_name);
This page took 0.025048 seconds and 4 git commands to generate.