typeck.c (merge_types): Handle cv-qualified pointer-to-member types correctly.
authorMark Mitchell <mark@codesourcery.com>
Mon, 11 Aug 2003 23:11:32 +0000 (23:11 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 11 Aug 2003 23:11:32 +0000 (23:11 +0000)
* typeck.c (merge_types): Handle cv-qualified pointer-to-member
types correctly.

* g++.dg/conversion/ptrmem1.C: New test.

From-SVN: r70341

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

index 191879fe25f660458a5576bd27a2795ea16bbbb7..00412d447ddb69f0dcfa2884771e67ae9791e964 100644 (file)
@@ -1,3 +1,8 @@
+2003-08-11  Mark Mitchell  <mark@codesourcery.com>
+
+       * typeck.c (merge_types): Handle cv-qualified pointer-to-member
+       types correctly.
+
 2003-08-10  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/11789
index 5cb8ed4b113d8da4b7e1b05a7db890f6623548b1..f89b74ac2f6a9d277c548b947d224f59b6b5c887 100644 (file)
@@ -630,9 +630,14 @@ merge_types (tree t1, tree t2)
 
     case OFFSET_TYPE:
       {
-       tree base = TYPE_OFFSET_BASETYPE (t1);
-       tree target = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
-       t1 = build_offset_type (base, target);
+       int quals;
+       tree pointee;
+       quals = cp_type_quals (t1);
+       pointee = merge_types (TYPE_PTRMEM_POINTED_TO_TYPE (t1),
+                              TYPE_PTRMEM_POINTED_TO_TYPE (t2));
+       t1 = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
+                               pointee);
+       t1 = cp_build_qualified_type (t1, quals);
        break;
       }
 
index aee5e84ad4a99b810c72eaabb38a92c2b8a51131..16889895789ac1841131cbbce94493fdb09a0e4d 100644 (file)
@@ -1,3 +1,7 @@
+2003-08-11  Mark Mitchell  <mark@codesourcery.com>
+
+       * g++.dg/conversion/ptrmem1.C: New test.
+
 2003-08-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/11693
diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem1.C b/gcc/testsuite/g++.dg/conversion/ptrmem1.C
new file mode 100644 (file)
index 0000000..ed00ea3
--- /dev/null
@@ -0,0 +1,13 @@
+struct S {};
+
+void f (int S::*const*);
+
+typedef int I;
+
+void f (I S::*const*);
+
+void g() {
+  int S::*const* p;
+
+  f(p);
+}