I found that the compiler does NOT check the bound of an array within if statement. But if you use write statement, it would check.
That is strange.
real stLocalHazard (100)
Are you expecting a compile time error for that? If so you are being a bit optimistic to expect the compiler to evaluate the possible run time values of a variable that is used as an array index. Your case is simple but the general case is not and in many cases it would be impossible for the compile to predict. You will get a run time error however.
Much better practice to have say:
do iZipIndex = 1 , size( stLocalHazard)
An then if you change the dimension the code is still good.
How about you post a real, complete program that demonstrates your claim? I tried it and it did check the bounds.
D:\Projects>type t.f90 real stLocalHazard (100) stLocalHazard = 0 do iZipIndex =1 , 200 if (stLocalHazard(iZipIndex) .gt. 0) then print *, iZipIndex endif enddo end D:\Projects>ifort /check:bounds t.f90 Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 18.104.22.168 Build 20170811 Copyright (C) 1985-2017 Intel Corporation. All rights reserved. Microsoft (R) Incremental Linker Version 14.11.25547.0 Copyright (C) Microsoft Corporation. All rights reserved. -out:t.exe -subsystem:console t.obj D:\Projects>t.exe forrtl: severe (408): fort: (10): Subscript #1 of the array STLOCALHAZARD has value 101 which is greater than the upper bound of 100 Image PC Routine Line Source t.exe 00007FF7CE52DB01 Unknown Unknown Unknown t.exe 00007FF7CE521142 Unknown Unknown Unknown t.exe 00007FF7CE56FEB2 Unknown Unknown Unknown t.exe 00007FF7CE570255 Unknown Unknown Unknown KERNEL32.DLL 00007FFDC0851FE4 Unknown Unknown Unknown ntdll.dll 00007FFDC098EF91 Unknown Unknown Unknown
I don't think so, at least based on the comment about WRITE statements. A similar test in a WRITE would not give compile-time errors. ifort CAN give a compile-time bounds error, but it requires a constant for the subscript and that's not typical.
Rather, I think the OP saw something, jumped to a conclusion as to what the cause was, and then threw in an uncompilable snippet based on that assumption.