https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91606
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jason at gcc dot gnu.org --- Comment #10 from Richard Biener <rguenth at gcc dot gnu.org> --- So I think we can recover what the C++ FE tries to do (assign alias-set zero to the whole PMF struct) by really treating it as a fat pointer. That restores using alias-set zero for the _31->__pfn accesses and fixes the testcase. Index: gcc/cp/decl.c =================================================================== --- gcc/cp/decl.c (revision 276396) +++ gcc/cp/decl.c (working copy) @@ -9554,10 +9554,12 @@ build_ptrmemfunc_type (tree type) TYPE_PTRMEMFUNC_FLAG (t) = 1; field = build_decl (input_location, FIELD_DECL, pfn_identifier, type); + DECL_NONADDRESSABLE_P (field) = 1; fields = field; field = build_decl (input_location, FIELD_DECL, delta_identifier, delta_type_node); + DECL_NONADDRESSABLE_P (field) = 1; DECL_CHAIN (field) = fields; fields = field; this tells the middle-end that there are no accesses to those fields via pointers to the field but they always appear via pointers to the containing record (or containing records). I think that's true for what the C++ FE emits and for what a user can do with a PMF. Otherwise I fear what the C++ FE does in it's get_alias_set langhook doesn't work by design :/ I will test the above.