diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-08-27 21:42:55 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-08-27 21:42:55 +0000 |
commit | e6c28517069c27ab2a3600b8b23c5816fd35ee30 (patch) | |
tree | a40a9f01db662b18e0ec6a5970063abe955768bc /libiberty/cp-demangle.c | |
parent | 23bf036377584c73f04b4c0ca25a1c3e1e57fbd6 (diff) | |
download | gcc-e6c28517069c27ab2a3600b8b23c5816fd35ee30.tar.gz |
PR other/28797
* cp-demangle.c (d_pointer_to_member_type): Do add a substitution
for a qualified member which is not a function.
* testsuite/demangle-expected: Add test case.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116493 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty/cp-demangle.c')
-rw-r--r-- | libiberty/cp-demangle.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index 109d533b524..c7ee8786d92 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -2081,13 +2081,22 @@ d_pointer_to_member_type (struct d_info *di) g++ does not work that way. g++ treats only the CV-qualified member function as a substitution source. FIXME. So to work with g++, we need to pull off the CV-qualifiers here, in order to - avoid calling add_substitution() in cplus_demangle_type(). */ + avoid calling add_substitution() in cplus_demangle_type(). But + for a CV-qualified member which is not a function, g++ does + follow the ABI, so we need to handle that case here by calling + d_add_substitution ourselves. */ pmem = d_cv_qualifiers (di, &mem, 1); if (pmem == NULL) return NULL; *pmem = cplus_demangle_type (di); + if (pmem != &mem && (*pmem)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE) + { + if (! d_add_substitution (di, mem)) + return NULL; + } + return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem); } |