From 149a7f801f64efdc61c4194d8632c11989e12dcd Mon Sep 17 00:00:00 2001
From: mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sun, 27 Jul 2003 18:25:57 +0000
Subject: [PATCH] 	* call.c (standard_conversion): Tweak handling of 
 pointer-to-member types. 	* pt.c (tsubst): Correctly qualify
 pointers-to-data member types. 	* typeck.c (comp_ptr_ttypes_real):
 Check qualifiers on 	pointer-to-data member types.

	* g++.dg/template/ptrmem6.C: New test.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@69855 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/cp/ChangeLog                        |  8 ++++++++
 gcc/cp/call.c                           |  4 ++--
 gcc/cp/pt.c                             |  4 +++-
 gcc/cp/typeck.c                         |  8 ++++----
 gcc/testsuite/ChangeLog                 |  4 ++++
 gcc/testsuite/g++.dg/template/ptrmem6.C | 10 ++++++++++
 6 files changed, 31 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/template/ptrmem6.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ad86f1aa5e02..209e1adce9e8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2003-07-27  Mark Mitchell  <mark@codesourcery.com>
+
+	* call.c (standard_conversion): Tweak handling of
+	pointer-to-member types.
+	* pt.c (tsubst): Correctly qualify pointers-to-data member types.
+	* typeck.c (comp_ptr_ttypes_real): Check qualifiers on
+	pointer-to-data member types.
+
 2003-07-27  Nathan Sidwell  <nathan@codesourcery.com>
 
 	* parser.c (cp_parser_type_parameter): Reformat.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 58888eacf521..7e3302fa0f7d 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -715,8 +715,8 @@ standard_conversion (tree to, tree from, tree expr)
 	}
       else
 	{
-	  to_pointee = to;
-	  from_pointee = from;
+	  to_pointee = TYPE_PTRMEM_POINTED_TO_TYPE (to);
+	  from_pointee = TYPE_PTRMEM_POINTED_TO_TYPE (from);
 	}
 
       if (same_type_p (from, to))
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 667037231787..efbf75abb694 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -6827,7 +6827,9 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
 	    return build_ptrmemfunc_type (build_pointer_type (method_type));
 	  }
 	else
-	  return build_ptrmem_type (r, type);
+	  return cp_build_qualified_type_real (build_ptrmem_type (r, type),
+					       TYPE_QUALS (t),
+					       complain);
       }
     case FUNCTION_TYPE:
     case METHOD_TYPE:
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index faa71975f5a4..ec6765b28b06 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -6013,9 +6013,9 @@ comp_ptr_ttypes_real (tree to, tree from, int constp)
 	return 0;
 
       if (TREE_CODE (from) == OFFSET_TYPE
-	  && same_type_p (TYPE_OFFSET_BASETYPE (from),
-			  TYPE_OFFSET_BASETYPE (to)))
-	  continue;
+	  && !same_type_p (TYPE_OFFSET_BASETYPE (from),
+			   TYPE_OFFSET_BASETYPE (to)))
+	return 0;
 
       /* Const and volatile mean something different for function types,
 	 so the usual checks are not appropriate.  */
@@ -6035,7 +6035,7 @@ comp_ptr_ttypes_real (tree to, tree from, int constp)
 	    constp &= TYPE_READONLY (to);
 	}
 
-      if (TREE_CODE (to) != POINTER_TYPE)
+      if (TREE_CODE (to) != POINTER_TYPE && !TYPE_PTR_TO_MEMBER_P (to))
 	return ((constp >= 0 || to_more_cv_qualified)
 		&& same_type_ignoring_top_level_qualifiers_p (to, from));
     }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c06df55a540d..1057be5c667d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2003-07-27  Mark Mitchell  <mark@codesourcery.com>
+
+	* g++.dg/template/ptrmem6.C: New test.
+
 2003-07-26  Geoffrey Keating  <geoffk@apple.com>
 
 	* gcc.c-torture/compile/zero-strct-2.c: New test.
diff --git a/gcc/testsuite/g++.dg/template/ptrmem6.C b/gcc/testsuite/g++.dg/template/ptrmem6.C
new file mode 100644
index 000000000000..0d7dec219813
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ptrmem6.C
@@ -0,0 +1,10 @@
+struct S {};
+
+void g(int S::**);
+
+template <typename T>
+void f (int T::* volatile *p) {
+  g(p); // { dg-error "" }
+}
+
+template void f(int S::* volatile *); // { dg-error "instantiated" }
-- 
GitLab