Commit 24272dc0 by Mark Mitchell Committed by Mark Mitchell

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
parent 1b4a93f7
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
we're going to use it more than once.
......
......@@ -2691,7 +2691,11 @@ extern int flag_new_for_scope;
/* Returns the pfn field from a TYPE_PTRMEMFUNC_P. */
#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) \
(TYPE_PTRMEM_P ((NODE)) \
? TYPE_OFFSET_BASETYPE (TREE_TYPE ((NODE))) \
......
......@@ -1928,7 +1928,24 @@ write_pointer_to_member_type (type)
tree type;
{
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));
}
......
// Build don't link:
// Origin: Mark Mitchell <mark@codesourcery.com>
struct S {};
void f (void (S::*)()) {}
void f (void (S::*)() const) {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment