While bootstrapping GCC on S/390 the following warning occurs: gcc/fortran/io.c: In function 'bool gfc_resolve_dt(gfc_code*, gfc_dt*, locus*)': gcc/fortran/io.c:3857:7: error: 'num' may be used uninitialized in this function [-Werror=maybe-uninitialized] 3857 | if (num == 0) | ^~ gcc/fortran/io.c:3843:11: note: 'num' was declared here 3843 | int num;
Since gfc_resolve_dt is a non-static function we cannot assume anything about argument DT. Argument DT gets passed to function check_io_constraints which passes values depending on DT, namely dt->asynchronous->value.character.string to function compare_to_allowed_values as well as argument warn which is true as soon as DT->dterr is true. Thus both arguments depend on DT. If function compare_to_allowed_values is called with dt->asynchronous->value.character.string not being an allowed value, and ALLOWED_F2003 as well as ALLOWED_GNU being NULL (which is the case at the particular call side), and WARN equals true, then the function returns with a non-zero value and leaves num uninitialized which renders the warning true. Initializing num to any value but zero mimics the behavior of an uninitialized variable except UB because zero is the only value it is tested for at the moment. Since num is used as an index into array asynchronous initializing it to 2 seems plausible. Bootstrapped and regtested on S/390. Ok for master? gcc/fortran/ChangeLog: 2020-04-28 Stefan Schulze Frielinghaus <stefa...@linux.ibm.com> PR fortran/94769 * io.c (check_io_constraints): Initialize local variable num. --- gcc/fortran/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index e066666e01d..4526f729d1d 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -3840,7 +3840,7 @@ if (condition) \ if (dt->asynchronous) { - int num; + int num = 2; static const char * asynchronous[] = { "YES", "NO", NULL }; /* Note: gfc_reduce_init_expr reports an error if not init-expr. */ -- 2.25.3