When I tested this before (some years ago), adding "restrict" to the C pointers resulted in the same behavior, so the aliasing default seem to be the key issue.
Your compiler very likely assumes strict aliasing at whatever optimization level you're already using, so restrict usually won't do much. GCC does at O2, keil (and clang?) at O1.
“strict aliasing” refers to disallowing pointers of different types to alias. In the context of a function that accepts two arrays of floats, for example, it doesn’t apply
That looks correct from playing around in godbolt.
But restrict says "I promise that these things don't overlap, on penalty of my program going to hell". Is that what's going on in Fortran?
yes, Fortran forbids referring to the same memory location by multiple names.
Nope. There’s lots of ways to alias storage in Fortran.
sorry, I meant in the case of function parameters, though I'm far from a fortran expert so there may be exceptions.