cp-tree.h (TYPE_PTRMEM_CLASS_TYPE): Improve documentation.

* cp-tree.h (TYPE_PTRMEM_CLASS_TYPE): Improve documentation.
	* mangle.c (write_pointer_to_member_type): Fix mangling of
	pointers to cv-qualified member function types.

From-SVN: r41373
This commit is contained in:
Mark Mitchell 2001-04-16 05:51:38 +00:00 committed by Mark Mitchell
parent 1b4a93f79b
commit 24272dc037
4 changed files with 34 additions and 2 deletions

View File

@ -1,5 +1,9 @@
2001-04-15 Mark Mitchell <mark@codesourcery.com> 2001-04-15 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (TYPE_PTRMEM_CLASS_TYPE): Improve documentation.
* mangle.c (write_pointer_to_member_type): Fix mangling of
pointers to cv-qualified member function types.
* init.c (build_delete): Create a SAVE_EXPR for the address if * init.c (build_delete): Create a SAVE_EXPR for the address if
we're going to use it more than once. we're going to use it more than once.

View File

@ -2691,7 +2691,11 @@ extern int flag_new_for_scope;
/* Returns the pfn field from a TYPE_PTRMEMFUNC_P. */ /* Returns the pfn field from a TYPE_PTRMEMFUNC_P. */
#define PFN_FROM_PTRMEMFUNC(NODE) pfn_from_ptrmemfunc ((NODE)) #define PFN_FROM_PTRMEMFUNC(NODE) pfn_from_ptrmemfunc ((NODE))
/* For a pointer-to-member type of the form `T X::*', this is `X'. */ /* For a pointer-to-member type of the form `T X::*', this is `X'.
For a type like `void (X::*)() const', this type is `X', not `const
X'. To get at the `const X' you have to look at the
TYPE_PTRMEM_POINTED_TO_TYPE; there, the first parameter will have
type `const X*'. */
#define TYPE_PTRMEM_CLASS_TYPE(NODE) \ #define TYPE_PTRMEM_CLASS_TYPE(NODE) \
(TYPE_PTRMEM_P ((NODE)) \ (TYPE_PTRMEM_P ((NODE)) \
? TYPE_OFFSET_BASETYPE (TREE_TYPE ((NODE))) \ ? TYPE_OFFSET_BASETYPE (TREE_TYPE ((NODE))) \

View File

@ -1928,7 +1928,24 @@ write_pointer_to_member_type (type)
tree type; tree type;
{ {
write_char ('M'); write_char ('M');
write_type (TYPE_PTRMEM_CLASS_TYPE (type)); /* For a pointer-to-function member, the class type may be
cv-qualified, bug that won't be reflected in
TYPE_PTRMEM_CLASS_TYPE. So, we go fishing around in
TYPE_PTRMEM_POINTED_TO_TYPE instead. */
if (TYPE_PTRMEMFUNC_P (type))
{
tree fn_type;
tree this_type;
fn_type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
/* The first parameter must be a POINTER_TYPE pointing to the
`this' parameter. */
this_type = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fn_type)));
write_type (this_type);
}
/* For a pointer-to-data member, things are simpler. */
else
write_type (TYPE_PTRMEM_CLASS_TYPE (type));
write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type)); write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type));
} }

View File

@ -0,0 +1,7 @@
// Build don't link:
// Origin: Mark Mitchell <mark@codesourcery.com>
struct S {};
void f (void (S::*)()) {}
void f (void (S::*)() const) {}