Revert 2000-12-01 Nathan Sidwell <nathan@codesourcery.com>, It is incorrect.

cp:
	Revert 2000-12-01  Nathan Sidwell  <nathan@codesourcery.com>,
	It is incorrect.
	* typeck.c (build_static_cast): Compare non-qualified types
	with pointer to member conversions.
testsuite:
	* testsuite/g++.dg/overload/pmf1.C: New test.

From-SVN: r50591
This commit is contained in:
Nathan Sidwell 2002-03-11 20:34:51 +00:00 committed by Nathan Sidwell
parent 61eece67a6
commit 999cc24c08
5 changed files with 50 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2002-03-11 Nathan Sidwell <nathan@codesourcery.com>
Revert 2000-12-01 Nathan Sidwell <nathan@codesourcery.com>,
It is incorrect.
* typeck.c (build_static_cast): Compare non-qualified types
with pointer to member conversions.
2002-03-11 Dan Nicolaescu <dann@ics.uci.edu>
Daniel Berlin <dan@dberlin.org>

View File

@ -795,9 +795,8 @@ standard_conversion (to, from, expr)
{
tree fbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (from));
tree tbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (to));
tree binfo = lookup_base (tbase, fbase, ba_check, NULL);
if (binfo && !binfo_from_vbase (binfo)
if (DERIVED_FROM_P (fbase, tbase)
&& (same_type_ignoring_top_level_qualifiers_p
(TREE_TYPE (TREE_TYPE (from)),
TREE_TYPE (TREE_TYPE (to)))))
@ -843,9 +842,8 @@ standard_conversion (to, from, expr)
tree tofn = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (to));
tree fbase = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fromfn)));
tree tbase = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (tofn)));
tree binfo = lookup_base (tbase, fbase, ba_check, NULL);
if (!binfo || binfo_from_vbase (binfo)
if (!DERIVED_FROM_P (fbase, tbase)
|| !same_type_p (TREE_TYPE (fromfn), TREE_TYPE (tofn))
|| !compparms (TREE_CHAIN (TYPE_ARG_TYPES (fromfn)),
TREE_CHAIN (TYPE_ARG_TYPES (tofn)))

View File

@ -5078,6 +5078,22 @@ build_static_cast (type, expr)
&& kind != bk_via_virtual)
ok = 1;
}
else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
{
/* They're pointers to members. The pointed to objects must be
the same (ignoring CV qualifiers), and the containing classes
must be related non-virtually. */
base_kind kind;
if (same_type_p
(strip_all_pointer_quals (TREE_TYPE (TREE_TYPE (type))),
strip_all_pointer_quals (TREE_TYPE (TREE_TYPE (intype))))
&& (lookup_base (TYPE_OFFSET_BASETYPE (TREE_TYPE (intype)),
TYPE_OFFSET_BASETYPE (TREE_TYPE (type)),
ba_ignore | ba_quiet, &kind))
&& kind != bk_via_virtual)
ok = 1;
}
else if (TREE_CODE (intype) != BOOLEAN_TYPE
&& TREE_CODE (type) != ARRAY_TYPE
&& TREE_CODE (type) != FUNCTION_TYPE

View File

@ -1,3 +1,7 @@
2002-03-11 Nathan Sidwell <nathan@codesourcery.com>
* testsuite/g++.dg/overload/pmf1.C: New test.
2002-03-11 Kazu Hirata <kazu@hxi.com>
* gcc.c-torture/execute/20020307-1.c: Use long.

View File

@ -0,0 +1,21 @@
// { dg-do compile }
// Copyright (C) 2002 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 04 Mar 2002 <nathan@codesourcery.com>
// Jason Merrill <jason@redhat.com>
struct A { int i; };
struct B: private A {};
struct C {
C (int A::*);
};
int A::*aip = &A::i;
void f (int B::*) {} // should choose this, even though it's ill-formed
void f (C) {} // even though this would be well-formed
int main ()
{
f (aip); // { dg-error "`A' is an inaccessible base of `B'" "" }
}