2002-11-06 Klee Dienes * testsuite/demangle-expected: Add test-case for const pointer-to-member as argument to function (_Z1xM1sKFvvE). * cp-demangle.c (demangle_type_ptr): Add a recognizer for CV-qualifiers in the special-case code for pointer-to-member. Index: cp-demangle.c =================================================================== RCS file: /cvs/Darwin/src/live/cygnus/src/libiberty/cp-demangle.c,v retrieving revision 1.6 diff -u -r1.6 cp-demangle.c --- cp-demangle.c 2002/09/26 22:05:52 1.6 +++ cp-demangle.c 2002/11/07 12:15:37 @@ -2243,7 +2243,10 @@ { /* A pointer-to-member. */ dyn_string_t class_type; - + dyn_string_t cv_qualifiers; + int has_cv_qualifiers = 0; + char npeek; + /* Eat the 'M'. */ advance_char (dm); @@ -2252,6 +2255,16 @@ RETURN_IF_ERROR (demangle_type (dm)); class_type = (dyn_string_t) result_pop (dm); + npeek = peek_char (dm); + if ((npeek == 'r') || (npeek == 'V') || (npeek == 'K')) + { + has_cv_qualifiers = 1; + /* Snarf up CV qualifiers. */ + cv_qualifiers = dyn_string_new (24); + if (cv_qualifiers == NULL) + return STATUS_ALLOCATION_FAILED; + demangle_CV_qualifiers (dm, cv_qualifiers); + } if (peek_char (dm) == 'F') /* A pointer-to-member function. We want output along the lines of `void (C::*) (int, int)'. Demangle the function @@ -2277,6 +2290,16 @@ /* The pointer-to-member notation (e.g. `C::*') follows the member's type. */ *insert_pos = result_caret_pos (dm); + } + if (has_cv_qualifiers) + { + /* Emit them, preceded by a space. */ + status = result_add_char (dm, ' '); + if (STATUS_NO_ERROR (status)) + status = result_add_string (dm, cv_qualifiers); + /* Clean up. */ + dyn_string_delete (cv_qualifiers); + RETURN_IF_ERROR (status); } /* Build the pointer-to-member notation. */ Index: testsuite/demangle-expected =================================================================== RCS file: /cvs/Darwin/src/live/cygnus/src/libiberty/testsuite/demangle-expected,v retrieving revision 1.5 diff -u -r1.5 demangle-expected --- demangle-expected 2002/09/26 22:06:03 1.5 +++ demangle-expected 2002/11/07 12:15:41 @@ -2598,6 +2598,10 @@ --format=gnu-v3 St9bad_alloc std::bad_alloc +# +--format=gnu-v3 +_Z1xM1sKFvvE +x(void (s::*)() const) # # This caused an infinite loop. # We still don't demangle this correctly, but at least we don't hang.