Just a quick addition here as I was starting to work on things I realized where some misunderstandings were coming from. (Please also see my previous e-mail, it is all still relevant, I just wanted to clarify this.)
(From the other thread) > > @@ -9949,7 +9951,8 @@ build_over_call (struct z_candidate cand, int flags, > > tsubst_flags_t complain) > > } > > } > > / Bypass access control for 'this' parameter. */ > > - else if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) > > + else if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE > > + || DECL_XOBJ_MEMBER_FUNC_P (fn)) > > > We don't want to take this path for xob fns. Instead I think we need to > change the existing: > > > gcc_assert (first_arg == NULL_TREE); > > > to assert that if first_arg is non-null, we're dealing with an xob fn, > and then go ahead and do the same conversion as the loop body on first_arg. (This thread) > > Yeah, as I noted above I realized that just handling it the same way as > > iobj member functions is fundamentally broken. I was staring at it last > > night and eventually realized that I could just copy the loop body. I > > ended up asserting in the body handling the implicit object argument > > for xobj member functions that first_arg != NULL_TREE, which I wasn't > > sure of, but it seems to work. > > > That sounds like it might cause trouble with > > struct A { > void f(this A); > }; > > int main() > { > (&A::f) (A()); > } > Upon reviewing your reply in the other thread, I noticed you are maybe misunderstanding the assertion a little bit. ``` else if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) { /* SNIP */ if (first_arg != NULL_TREE) first_arg = NULL_TREE; else ++arg_index; ++i; is_method = 1; } else if (DECL_XOBJ_MEMBER_FUNC_P (fn)) { gcc_assert (cand->first_arg); /* SNIP */ first_arg = NULL_TREE; } ``` I already showed my code here but I didn't think to include the previous conditional block to demonstrate how the first_arg variable gets handled in it. Although, maybe you understood they set it to NULL_TREE by the end of the block and I just poorly communicated that I would be doing the same. Perhaps you think it better to handle the implicit object argument within the loop, but given that it is stored in first_arg I don't think that would be correct. Granted, as I previously said, maybe there are some situations where it isn't that I haven't encountered yet. The other thing is there is some handling in the loop that isn't relevant to the implicit object argument. Well, I would also just argue this function needs a fair degree of refactoring, but I've already talked about that. Anyway, hopefully that clarifies things, and hopefully things actually needed to be clarified and I'm not being a fool here. :) That's all I had to add about this, back to work now. Alex