]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix two issues with unused/unset variable warnings.
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sat, 4 Jul 2026 17:03:26 +0000 (19:03 +0200)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sat, 4 Jul 2026 17:05:18 +0000 (19:05 +0200)
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.

gcc/fortran/gfortran.h
gcc/fortran/io.cc
gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/warn_undefined_vars_5.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/warn_undefined_vars_6.f90 [new file with mode: 0644]

index 907a42a873441fff33c4347dfff84f430da1f631..062e9b0c9d8437389121de394f7cdd9d79b6ddb4 100644 (file)
@@ -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;
 
index db0d1fdce798fea2ef0360c3db165eace34bb124..034358e577defcbfdee858d0d0e191e71d3fe876 100644 (file)
@@ -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;
        }
     }
index 4fc7b5a4d740bbc843e90db1e6aa332e109fb94c..1b461f67afd2bfc0ea32b07dc54de0bb7eb2d911 100644 (file)
@@ -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 (file)
index 0000000..abbbf24
--- /dev/null
@@ -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 (file)
index 0000000..25e0c16
--- /dev/null
@@ -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