From: Thomas Koenig Date: Sat, 4 Jul 2026 17:03:26 +0000 (+0200) Subject: Fix two issues with unused/unset variable warnings. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2fef81e96ea3035c6a99dd22c64f610bde40d42c;p=thirdparty%2Fgcc.git Fix two issues with unused/unset variable warnings. This patch fixes an ICE and adds correct diagnostics for reading/writing variables via namelist, plus sets error variables for STOP as used so incorrect warnings are avoided. gcc/fortran/ChangeLog: PR fortran/126058 PR fortran/126090 * gfortran.h (gfc_dt): Add member nml_where. * io.cc (match_dt_element): Set nml_where. (gfc_resolve_dt): Mark variable in namelist to be read with correct locus and VALUE_READ. Mark expression in write namelist as used. (match_io): Set nml_where for data transfer. * resolve.cc: Mark code->expr1 as used for PAUSE, STOP and ERROR STOP. gcc/testsuite/ChangeLog: PR fortran/126058 PR fortran/126090 * gfortran.dg/warn_undefined_vars_5.f90: New test. * gfortran.dg/warn_undefined_vars_6.f90: New test. --- diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 907a42a8734..062e9b0c9d8 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -3205,7 +3205,7 @@ typedef struct gfc_st_label *format_label; gfc_st_label *err, *end, *eor; - locus eor_where, end_where, err_where; + locus eor_where, end_where, err_where, nml_where; } gfc_dt; diff --git a/gcc/fortran/io.cc b/gcc/fortran/io.cc index db0d1fdce79..034358e577d 100644 --- a/gcc/fortran/io.cc +++ b/gcc/fortran/io.cc @@ -3152,6 +3152,7 @@ match_dt_element (io_kind k, gfc_dt *dt) char name[GFC_MAX_SYMBOL_LEN + 1]; gfc_symbol *sym; match m; + locus where; if (gfc_match (" unit =") == MATCH_YES) { @@ -3167,6 +3168,7 @@ match_dt_element (io_kind k, gfc_dt *dt) return m; } + where = gfc_current_locus; if (gfc_match (" nml = %n", name) == MATCH_YES) { if (dt->namelist != NULL) @@ -3186,6 +3188,7 @@ match_dt_element (io_kind k, gfc_dt *dt) } dt->namelist = sym; + dt->nml_where = where; if (k == M_READ && check_namelist (sym)) return MATCH_ERROR; @@ -3443,9 +3446,10 @@ gfc_resolve_dt (gfc_code *dt_code, gfc_dt *dt, locus *loc) gfc_expr* e; bool t; + e = gfc_get_variable_expr (gfc_find_sym_in_symtree (n->sym)); + if (k == M_READ) { - e = gfc_get_variable_expr (gfc_find_sym_in_symtree (n->sym)); t = gfc_check_vardef_context (e, false, false, false, NULL); gfc_free_expr (e); @@ -3457,8 +3461,16 @@ gfc_resolve_dt (gfc_code *dt_code, gfc_dt *dt, locus *loc) dt->namelist->name, loc, n->sym->name); return false; } - gfc_value_set_at (n->sym, NULL, VALUE_VARDEF); + gfc_value_set_at (n->sym, &dt->nml_where, VALUE_READ); } + else if (k == M_WRITE || k == M_PRINT) + { + e->where = dt->nml_where; + gfc_value_used_expr (e, VALUE_USED); + gfc_free_expr (e); + } + + n->sym->attr.referenced = 1; t = dtio_procs_present (n->sym, k); @@ -4401,6 +4413,7 @@ match_io (io_kind k) m = MATCH_ERROR; goto cleanup; } + dt->nml_where = where; goto next; } } diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 4fc7b5a4d74..1b461f67afd 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -14371,7 +14371,6 @@ start: case EXEC_END_BLOCK: case EXEC_END_NESTED_BLOCK: case EXEC_CYCLE: - case EXEC_PAUSE: break; case EXEC_STOP: @@ -14400,6 +14399,10 @@ start: || code->expr2->rank != 0)) gfc_error ("QUIET specifier at %L must be a scalar LOGICAL", &code->expr2->where); + + /* Fall through. */ + case EXEC_PAUSE: + gfc_value_used_expr (code->expr1, VALUE_USED); break; case EXEC_EXIT: diff --git a/gcc/testsuite/gfortran.dg/warn_undefined_vars_5.f90 b/gcc/testsuite/gfortran.dg/warn_undefined_vars_5.f90 new file mode 100644 index 00000000000..abbbf2498a2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/warn_undefined_vars_5.f90 @@ -0,0 +1,10 @@ +! { dg-do compile } +! { dg-additional-options "-Wundefined-vars" } +program memain + implicit none + integer :: n, m + namelist /n1/ n + namelist /n2/ m + write (*,n1) ! { dg-warning "Undefined variable" } + write (*,nml=n2) ! { dg-warning "Undefined variable" } +end program memain diff --git a/gcc/testsuite/gfortran.dg/warn_undefined_vars_6.f90 b/gcc/testsuite/gfortran.dg/warn_undefined_vars_6.f90 new file mode 100644 index 00000000000..25e0c16def7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/warn_undefined_vars_6.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } +! { dg-additional-options "-Wundefined-vars -std=legacy" } +! PR 126090 - warnings with STOP and friends +program memain + character(8) :: s + character(8) :: s1, s2, s3 + s = "abc" + error stop s + stop s + pause s + error stop s1 ! { dg-warning "Undefined variable" } + stop s2 ! { dg-warning "Undefined variable" } + pause s3 ! { dg-warning "Undefined variable" } +end program memain