ABI change: Mangle `void (A::*)() const' as M1AKFvvE, not MK1AFvvE.
authorJason Merrill <jason@redhat.com>
Wed, 20 Feb 2002 04:09:05 +0000 (23:09 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 20 Feb 2002 04:09:05 +0000 (23:09 -0500)
ABI change: Mangle `void (A::*)() const' as
M1AKFvvE, not MK1AFvvE.
* mangle.c (write_function_type): Write cv-quals for member
function type here.
(write_pointer_to_member_type): Not here.

From-SVN: r49887

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/testsuite/g++.dg/abi/mangle5.C [new file with mode: 0644]

index 587ce8e70270dd8a041718de5079d808d24e2841..3f4016330dd32b0372982cfa8c6ae684525a1eb0 100644 (file)
@@ -1,3 +1,11 @@
+2002-02-19  Jason Merrill  <jason@redhat.com>
+
+       ABI change: Mangle `void (A::*)() const' as 
+       M1AKFvvE, not MK1AFvvE.
+       * mangle.c (write_function_type): Write cv-quals for member
+       function type here.
+       (write_pointer_to_member_type): Not here.
+
 2002-02-18  Jason Merrill  <jason@redhat.com>
 
        * pt.c (do_type_instantiation): Don't pedwarn if in_system_header.
index 00e5143bca7b915b4e68f41674edc3a82d511bbb..360e1fc759db456c941453b1588e2ed98aff626f 100644 (file)
@@ -1595,6 +1595,17 @@ write_function_type (type)
 {
   MANGLE_TRACE_TREE ("function-type", type);
 
+  /* For a pointer to member function, the function type may have
+     cv-qualifiers, indicating the quals for the artificial 'this'
+     parameter.  */
+  if (TREE_CODE (type) == METHOD_TYPE)
+    {
+      /* The first parameter must be a POINTER_TYPE pointing to the
+        `this' parameter.  */
+      tree this_type = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (type)));
+      write_CV_qualifiers_for_type (this_type);
+    }
+
   write_char ('F');
   /* We don't track whether or not a type is `extern "C"'.  Note that
      you can have an `extern "C"' function that does not have
@@ -2021,24 +2032,7 @@ write_pointer_to_member_type (type)
      tree type;
 {
   write_char ('M');
-  /* For a pointer-to-function member, the class type may be
-     cv-qualified, but that won't be reflected in
-     TYPE_PTRMEM_CLASS_TYPE.  So, we go fishing around in
-     TYPE_PTRMEM_POINTED_TO_TYPE instead.  */
-  if (TYPE_PTRMEMFUNC_P (type))
-    {
-      tree fn_type;
-      tree this_type;
-
-      fn_type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
-      /* The first parameter must be a POINTER_TYPE pointing to the
-        `this' parameter.  */
-      this_type = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fn_type)));
-      write_type (this_type);
-    }
-  /* For a pointer-to-data member, things are simpler.  */
-  else
-    write_type (TYPE_PTRMEM_CLASS_TYPE (type));
+  write_type (TYPE_PTRMEM_CLASS_TYPE (type));
   write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type));
 }
 
diff --git a/gcc/testsuite/g++.dg/abi/mangle5.C b/gcc/testsuite/g++.dg/abi/mangle5.C
new file mode 100644 (file)
index 0000000..99a0873
--- /dev/null
@@ -0,0 +1,6 @@
+// Test mangling of pointers to cv-qualified member functions
+
+struct A;
+void f (void (A::*)() const) {}
+
+// { dg-final { scan-assembler "\n_?_Z1fM1AKFvvE\[: \t\n\]" } }