]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2003-04-18 David Carlton <carlton@bactrian.org>
authorDavid Carlton <carlton@bactrian.org>
Fri, 18 Apr 2003 18:10:50 +0000 (18:10 +0000)
committerDavid Carlton <carlton@bactrian.org>
Fri, 18 Apr 2003 18:10:50 +0000 (18:10 +0000)
* mdebugread.c (parse_symbol): Move up declaration of 'iter'.
* dwarf2read.c (add_partial_namespace): Move up declaration of
'full_name'.
* cp-support.c (cp_find_first_component): Accept 'operator' in
more locations.

2003-04-18  David Carlton  <carlton@bactrian.org>

* gdb.c++/maint.exp (test_first_component): Add tests for
'operator' in more locations.

gdb/ChangeLog
gdb/cp-support.c
gdb/dwarf2read.c
gdb/mdebugread.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.c++/maint.exp

index b9aeef5e055be43737a4f93b8652dbe24f0408cd..ec0af51491a7d2972ed76845caf2509a32c09709 100644 (file)
@@ -1,3 +1,11 @@
+2003-04-18  David Carlton  <carlton@bactrian.org>
+
+       * mdebugread.c (parse_symbol): Move up declaration of 'iter'.
+       * dwarf2read.c (add_partial_namespace): Move up declaration of
+       'full_name'.
+       * cp-support.c (cp_find_first_component): Accept 'operator' in
+       more locations.
+
 2003-04-16  David Carlton  <carlton@bactrian.org>
 
        * Merge with mainline; tag is carlton_dictionary-20030416-merge.
index 784826bd3a053057955d68719d5b9ea607b37f01..b2f746c708adacb5d9f98478fefc4c25268f3266 100644 (file)
@@ -95,16 +95,7 @@ static void maintenance_print_namespace (char *args, int from_tty);
      'foo' in an anonymous namespace gets demangled as "(anonymous
      namespace)::foo".
 
-   - And operator names can contain parentheses or angle brackets.
-     Fortunately, I _think_ that operator names can only occur in a
-     fairly restrictive set of locations (in particular, they have be
-     at depth 0, don't they?).  */
-
-/* NOTE: carlton/2003-02-21: Daniel Jacobowitz came up with an example
-   where operator names don't occur at depth 0.  Sigh.  (It involved a
-   template argument that was a pointer: I hadn't realized that was
-   possible.)  Handling such edge cases does not seem like a
-   high-priority problem to me.  */
+   - And operator names can contain parentheses or angle brackets.  */
 
 /* FIXME: carlton/2003-03-13: We have several functions here with
    overlapping functionality; can we combine them?  Also, do they
@@ -247,40 +238,14 @@ method_name_from_physname (const char *physname)
 unsigned int
 cp_find_first_component (const char *name)
 {
-  /* Names like 'operator<<' screw up the recursion, so let's
-     special-case them.  I _hope_ they can only occur at the start of
-     a component.  */
-
   unsigned int index = 0;
-
-  if (strncmp (name, "operator", LENGTH_OF_OPERATOR) == 0)
-    {
-      index += LENGTH_OF_OPERATOR;
-      while (isspace(name[index]))
-       ++index;
-      switch (name[index])
-       {
-       case '<':
-         if (name[index + 1] == '<')
-           index += 2;
-         else
-           index += 1;
-         break;
-       case '>':
-       case '-':
-         if (name[index + 1] == '>')
-           index += 2;
-         else
-           index += 1;
-         break;
-       case '(':
-         index += 2;
-         break;
-       default:
-         index += 1;
-         break;
-       }
-    }
+  /* Operator names can show up in unexpected places.  Since these can
+     contain parentheses or angle brackets, they can screw up the
+     recursion.  But not every string 'operator' is part of an
+     operater name: e.g. you could have a variable 'cooperator'.  So
+     this variable tells us whether or not we should treat the string
+     'operator' as starting an operator.  */
+  int operator_possible = 1;
 
   for (;; ++index)
     {
@@ -299,6 +264,7 @@ cp_find_first_component (const char *name)
              gdb_assert (name[index] == ':');
              index += 2;
            }
+         operator_possible = 1;
          break;
        case '(':
          /* Similar comment as to '<'.  */
@@ -310,13 +276,63 @@ cp_find_first_component (const char *name)
              gdb_assert (name[index] == ':');
              index += 2;
            }
+         operator_possible = 1;
          break;
        case '>':
        case ')':
        case '\0':
        case ':':
          return index;
+       case 'o':
+         /* Operator names can screw up the recurson.  */
+         if (operator_possible
+             && strncmp (name + index, "operator", LENGTH_OF_OPERATOR) == 0)
+           {
+             index += LENGTH_OF_OPERATOR;
+             while (isspace(name[index]))
+               ++index;
+             switch (name[index])
+               {
+                 /* Skip over one less than the appropriate number of
+                    characters: the for loop will skip over the last
+                    one.  */
+               case '<':
+                 if (name[index + 1] == '<')
+                   index += 1;
+                 else
+                   index += 0;
+                 break;
+               case '>':
+               case '-':
+                 if (name[index + 1] == '>')
+                   index += 1;
+                 else
+                   index += 0;
+                 break;
+               case '(':
+                 index += 1;
+                 break;
+               default:
+                 index += 0;
+                 break;
+               }
+           }
+         operator_possible = 0;
+         break;
+       case ' ':
+       case ',':
+       case '.':
+       case '&':
+       case '*':
+         /* NOTE: carlton/2003-04-18: I'm not sure what the precise
+            set of relevant characters are here: it's necessary to
+            include any character that can show up before 'operator'
+            in a demangled name, and it's safe to include any
+            character that can't be part of an identifier's name.  */
+         operator_possible = 1;
+         break;
        default:
+         operator_possible = 0;
          break;
        }
     }
index 55c2412041ac2b4e44531be026f15a681f68165f..65b4e26c97fda9abafeb69270e71f3a7ae3bd8d5 100644 (file)
@@ -1686,9 +1686,11 @@ add_partial_namespace (struct partial_die_info *pdi, char *info_ptr,
   /* Calculate the full name of the namespace that we just entered.  */
 
   const char *new_name = pdi->name;
+  char *full_name;
+
   if (new_name == NULL)
     new_name = "(anonymous namespace)";
-  char *full_name = alloca (strlen (namespace) + 2 + strlen (new_name) + 1);
+  full_name = alloca (strlen (namespace) + 2 + strlen (new_name) + 1);
   strcpy (full_name, namespace);
   if (*namespace != '\0')
     strcat (full_name, "::");
index 8642ee8788847bd46fb65a018cc6b3304ae81855..bf2ad80b8c8374703a391f36c824b7ee8cdcccf3 100644 (file)
@@ -1231,10 +1231,10 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
              if (nparams > 0)
                {
+                 struct dict_iterator iter;
                  TYPE_NFIELDS (ftype) = nparams;
                  TYPE_FIELDS (ftype) = (struct field *)
                    TYPE_ALLOC (ftype, nparams * sizeof (struct field));
-                 struct dict_iterator iter;
 
                  for (sym = dict_iterator_first (BLOCK_DICT (b), &iter),
                         iparams = 0;
index f9364ccca6095552589e187c0ed1e6a19c566395..8776e7f57b8c67eb20cf3ce6069ed867cb1f4c8e 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-18  David Carlton  <carlton@bactrian.org>
+
+       * gdb.c++/maint.exp (test_first_component): Add tests for
+       'operator' in more locations.
+
 2003-04-15  David Carlton  <carlton@math.stanford.edu>
 
        * gdb.c++/maint.exp: New file.
index 6e1da97bd52fc96090f16448092d050935c62474..3da1a5a6581f252f59f78dbf099828ee68b08b7d 100644 (file)
@@ -63,6 +63,11 @@ proc test_first_component {} {
     test_single_component "foo(std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >)"
     test_single_component "operator>(X::Y)"
 
+    # Operator names can show up in weird places.
+
+    test_single_component "int operator<< <char>()"
+    test_single_component "T<Cooperator>"
+
     gdb_test "maint cp first_component foo::bar" "foo"
     gdb_test "maint cp first_component foo::bar::baz" "foo"
     gdb_test "maint cp first_component C<A>::bar" "C<A>"