A copy of what? It’s returning a pointer, so i has to be on the heap[0].
gc could create i on the stack then copy it to the heap, but if you plug that code into godbolt you can see that it is not that dumb, it creates a heap allocation then writes the literal directly into that.
[0] unless Foo is inlined and the result does not escape the caller’s frame, then that can be done away with.
Of course the compiler could inline it or do something else but semantically its a copy.