It has its uses, although not very often, at least not for me. One case that contiguous might be useful is when you have to deal with C interoperability. Say, you call a C function from within Fortran code that allocates memory and returns a pointer to that memory block. The corresponding Fortran pointer should be something like integer(kind=c_signed_char), dimension(:), pointer, contiguous :: data
I can recall a few cases that this didn’t work without the contiguous attribute.
Another example, actually taken from a program I wrote some time ago: Assume you have a C subroutine that renders an image using an array of RGB triplets for each pixel. Now, another subroutine, written in Fortran, has to read the data from an image file. We do not know in advance how big the image is, so we have to use an assumed-shape array to store the data; that array must be contiguous, otherwise the rendering subroutine will render garbage.
The programmer is her/himself responsible to make sure that is the case. Unlike in C where the compiler must take into account that things might overlap, the Fortran compiler can simply assume that to be the case. I guess the volatile attribute might help if you know that is not going to be the case?