Checking the sizes would require some tests at runtime (and an explicit interface), which is something that we want to avoid in general: if the routine does a little amount of computation and is repeatedly called, then the runtime tests can severely arm the performances. Note that with assumed-shape dummy arguments no size check is performed either (and actually it is impossible to check the sizes in this case).
As for the rank, they could not be easily checked at the times where no interfaces exist. And the ability to pass a rank 1 array as an actual argument to a routine where the dummy argument is a rank 2 (or more) array has been extensively used in the past (and is still used, even if there are now other mechanisms to achieve that). With assumed-shape dummy arguments the rank is checked.