https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95512
--- Comment #3 from anlauf at gcc dot gnu.org --- I didn't write the code, but for more context: trans.h has: #define GFC_TYPE_ARRAY_LBOUND(node, dim) \ (TYPE_LANG_SPECIFIC(node)->lbound[dim]) #define GFC_TYPE_ARRAY_UBOUND(node, dim) \ (TYPE_LANG_SPECIFIC(node)->ubound[dim]) The loop in trans-decl.c: for (dim = GFC_TYPE_ARRAY_RANK (type); dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type); dim++) { if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE) { GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest); TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1; } /* Don't try to use the unknown ubound for the last coarray dimension. */ if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE && dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type) - 1) { GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest); TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1; } } So the relevant check is in the loop header, and the current check is there for the last index. Maybe it is bad style, but I still consider it a false positive. cppcheck's view is probably too narrow to understand the range of dim.