aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Carlton <carlton@bactrian.org>2003-04-18 18:10:50 +0000
committerDavid Carlton <carlton@bactrian.org>2003-04-18 18:10:50 +0000
commit78f35437dacc7d2a1f88341a70098f1ce5299d05 (patch)
treea413b78953a6620c0e354eca655be5fe83e1cae7
parent0bb428781c4782c6236beb58c06052dccd382aa1 (diff)
downloadgdb-78f35437dacc7d2a1f88341a70098f1ce5299d05.zip
gdb-78f35437dacc7d2a1f88341a70098f1ce5299d05.tar.gz
gdb-78f35437dacc7d2a1f88341a70098f1ce5299d05.tar.bz2
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-18 David Carlton <carlton@bactrian.org> * gdb.c++/maint.exp (test_first_component): Add tests for 'operator' in more locations.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/cp-support.c102
-rw-r--r--gdb/dwarf2read.c4
-rw-r--r--gdb/mdebugread.c2
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.c++/maint.exp5
6 files changed, 81 insertions, 45 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b9aeef5e..ec0af51 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/cp-support.c b/gdb/cp-support.c
index 784826b..b2f746c 100644
--- a/gdb/cp-support.c
+++ b/gdb/cp-support.c
@@ -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;
}
}
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 55c2412..65b4e26 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -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, "::");
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 8642ee8..bf2ad80 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -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;
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index f9364cc..8776e7f 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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.
diff --git a/gdb/testsuite/gdb.c++/maint.exp b/gdb/testsuite/gdb.c++/maint.exp
index 6e1da97..3da1a5a 100644
--- a/gdb/testsuite/gdb.c++/maint.exp
+++ b/gdb/testsuite/gdb.c++/maint.exp
@@ -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>"