EDIT: this is incorrect, however I'm leaving it here because the discussion that follows in the comments is somewhat illuminating, and I hope valuable.
It's well-defined based on the evaluation order of operators in C (or C++).
Assignment forces evaluation of the right hand side of the expression first. Function application forces evaluation of its arguments first, so the effect seems reasonably clear (although I haven't tried running it, so feel free to correct me!). We can rewrite this using temporary variables (I'll call them t0 and t1), and I believe this might be a little clearer:
t0 = y++;
t1 = f(t0);
*y = t1;
The term "sequence point" is a bit of a red herring. A sequence point isn't really created, rather it's just the consequence of having a strict evaluation order defined for the language.
EDIT: While this answer seems intellectually satisfying, James McNellis's answer quotes the relevant piece of the C99 spec that states that the evaluation order of assignment is not well-defined. Full credit to him for actually checking his facts. I'm going to revise my answer from "it's well-defined" to "it's probably well-defined with respect to a particular compiler", as I think it's unlikely that most compilers would regularly change the order in which they emit such code (I say "probably" to account for any very aggressive optimisation).