diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/cp-support.c | 102 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 4 | ||||
-rw-r--r-- | gdb/mdebugread.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.c++/maint.exp | 5 |
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>" |