call.c (initialize_reference): Remove bogus assertion.

* call.c (initialize_reference): Remove bogus assertion.
	* decl.c (build_ptrmemfunc_type): Revert change of 2003-03-09.

	* g++.dg/init/ref5.C: New test.
	* g++.dg/parse/ptrmem1.C: Likewise.

From-SVN: r64316
This commit is contained in:
Mark Mitchell 2003-03-13 19:57:12 +00:00 committed by Mark Mitchell
parent 7210d5ae56
commit 26f8647153
6 changed files with 33 additions and 40 deletions

View file

@ -1,3 +1,8 @@
2003-03-13 Mark Mitchell <mark@codesourcery.com>
* call.c (initialize_reference): Remove bogus assertion.
* decl.c (build_ptrmemfunc_type): Revert change of 2003-03-09.
2003-03-12 Andrew Lewycky <andrew@mxc.ca>
PR c++/7050

View file

@ -6088,9 +6088,8 @@ initialize_reference (tree type, tree expr, tree decl)
conv = TREE_OPERAND (conv, 0);
/* If the next conversion is a BASE_CONV, skip that too -- but
remember that the conversion was required. */
if (TREE_CODE (conv) == BASE_CONV)
if (TREE_CODE (conv) == BASE_CONV && !NEED_TEMPORARY_P (conv))
{
my_friendly_assert (!NEED_TEMPORARY_P (conv), 20030307);
base_conv_type = TREE_TYPE (conv);
conv = TREE_OPERAND (conv, 0);
}

View file

@ -9297,49 +9297,11 @@ build_ptrmemfunc_type (tree type)
{
tree field, fields;
tree t;
tree method_type;
tree arg_type;
tree unqualified_variant = NULL_TREE;
if (type == error_mark_node)
return type;
/* If the METHOD_TYPE has any default parameters, make a copy that
does not have the default parameters. The pointer-to-member type
never has default parameters. */
method_type = TREE_TYPE (type);
for (arg_type = TYPE_ARG_TYPES (method_type);
arg_type;
arg_type = TREE_CHAIN (arg_type))
if (TREE_PURPOSE (arg_type))
{
/* At least one parameter has a default argument. */
tree arg_types = NULL_TREE;
tree *arg_type_p = &arg_types;
/* Copy the parameter types. The "this" parameter will be
added by build_cplus_method_type. */
for (arg_type = TREE_CHAIN (TYPE_ARG_TYPES (method_type));
arg_type;
arg_type = TREE_CHAIN (arg_type))
{
if (arg_type == void_list_node)
*arg_type_p = void_list_node;
else
*arg_type_p = build_tree_list (NULL_TREE,
TREE_VALUE (arg_type));
arg_type_p = &TREE_CHAIN (*arg_type_p);
}
/* Build the new METHOD_TYPE. */
method_type = build_cplus_method_type (TYPE_METHOD_BASETYPE (method_type),
TREE_TYPE (method_type),
arg_types);
/* Build the new POINTER_TYPE. */
type = cp_build_qualified_type (build_pointer_type (method_type),
cp_type_quals (type));
break;
}
/* If a canonical type already exists for this type, use it. We use
this method instead of type_hash_canon, because it only does a
simple equality check on the list of field members. */

View file

@ -1,3 +1,8 @@
2003-03-13 Mark Mitchell <mark@codesourcery.com>
* g++.dg/init/ref5.C: New test.
* g++.dg/parse/ptrmem1.C: Likewise.
2003-03-12 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* gcc.dg/special/ecos.exp (gcsec-1.c): Find linker used by gcc.

View file

@ -0,0 +1,12 @@
struct A { };
struct B : public A { };
struct X {
operator B();
};
X x;
int main()
{
const A& r = x;
return 0;
}

View file

@ -0,0 +1,10 @@
struct A {
void f(int = 0) const;
};
typedef void (A::*PF)(int) const;
void f()
{
PF pf = &A::f;
}