Revert 2000-12-01 Nathan Sidwell <nathan@codesourcery.com>, It is incorrect.
authorNathan Sidwell <nathan@codesourcery.com>
Mon, 11 Mar 2002 20:34:51 +0000 (20:34 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Mon, 11 Mar 2002 20:34:51 +0000 (20:34 +0000)
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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/overload/pmf1.C [new file with mode: 0644]

index d2f15802dc7dd9433272e07e0b4105efc7975c89..513dd00cb5b72e565c0fea31cd5c10a289a0af3b 100644 (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>
 
index 29e0c72caeaf991ae67a2aae2a60a818d699bd63..31b5baaf3fe9d4207b54971c6fb3f220aa2b9176 100644 (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)))
index e5f643c72d8d49a861c8feea03f386b8584d4bcb..b14687b5027b686a7ba889d32f71d810d5c71bca 100644 (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
index fc23908a4c3b897951633b948e13712fc4d742e5..354e9616129ce2bb311f4fa379ad2953541af79d 100644 (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.
diff --git a/gcc/testsuite/g++.dg/overload/pmf1.C b/gcc/testsuite/g++.dg/overload/pmf1.C
new file mode 100644 (file)
index 0000000..772cb53
--- /dev/null
@@ -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'" "" }
+}