On Thu, Nov 27, 2025 at 11:18:52AM +0530, Jason Merrill wrote:
> I wouldn't expect that to be an issue, the POINTER_TYPE to METHOD_TYPE.is
> immediately wrapped in the PMF RECORD_TYPE.
> 
> The comment suggests that the problem is that METHOD_TYPE isn't
> canonicalized properly, but build_method_type_directly sure seems to work to
> do that, so perhaps the comment is obsolete and we can just return -1?
> 
> That comment goes back to r81764 (6de9cd9a886ea695aa892c3c7c07818a7b7e9e6f),
> the tree-ssa merge.

Seems removing all the PMF special cases works just fine during
bootstrap/regtest, so here is an updated patch.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2025-11-28  Jakub Jelinek  <[email protected]>

        PR c++/119969
        * cp-objcp-common.cc (cxx_get_alias_set): Remove special cases
        for TYPE_PTRMEMFUNC_P and INDIRECT_TYPE_P for TYPE_PTRMEMFUNC_P.

        * g++.dg/torture/pr119969.C: New test.

--- gcc/cp/cp-objcp-common.cc.jj        2025-11-26 22:07:16.253007984 +0100
+++ gcc/cp/cp-objcp-common.cc   2025-11-27 19:08:27.951136838 +0100
@@ -180,12 +180,6 @@ cxx_get_alias_set (tree t)
        complete type.  */
     return get_alias_set (TYPE_CONTEXT (t));
 
-  /* Punt on PMFs until we canonicalize functions properly.  */
-  if (TYPE_PTRMEMFUNC_P (t)
-      || (INDIRECT_TYPE_P (t)
-         && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))))
-    return 0;
-
   return c_common_get_alias_set (t);
 }
 
--- gcc/testsuite/g++.dg/torture/pr119969.C.jj  2025-11-25 12:38:20.120143562 
+0100
+++ gcc/testsuite/g++.dg/torture/pr119969.C     2025-11-25 12:38:42.407758775 
+0100
@@ -0,0 +1,46 @@
+// PR c++/119969
+// { dg-do run }
+
+struct S {};
+using PMF = void (S::*)();
+using Block = PMF[16];
+using BlockPtr = Block*;
+
+struct IteratorImp {
+  Block** d_blockPtr_p;
+  PMF*  d_value_p;
+
+  void operator++();
+  PMF& operator*() const { return *d_value_p; }
+};
+
+void IteratorImp::operator++() {
+  int offset = 1 + (d_value_p - **d_blockPtr_p);
+  d_blockPtr_p += offset / 16;
+  d_value_p = **d_blockPtr_p + (offset % 16);
+}
+
+struct iterator {
+  IteratorImp d_imp;
+};
+
+struct D {
+  Block* d_blockPtrs[1];
+  Block  d_block;
+  PMF*   d_start_p;
+};
+
+D mX;
+
+void privateInit(int numElements) {
+  mX.d_blockPtrs[0] = &mX.d_block;
+  mX.d_start_p = mX.d_block + (numElements + 7);
+}
+
+int main() {
+  privateInit(0);
+  iterator cbgn = {{mX.d_blockPtrs, mX.d_block + 7}};
+  auto clast = cbgn;
+  ++clast.d_imp;
+  if (&*cbgn.d_imp == &*clast.d_imp) return 1;
+}


        Jakub

Reply via email to