Hello world,

what it says in the ChangeLog.

OK for trunk?

Best regards

        Thomas

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 9f1626c2949..d55aaa2080a 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -14366,7 +14366,6 @@ start:
 	case EXEC_END_BLOCK:
 	case EXEC_END_NESTED_BLOCK:
 	case EXEC_CYCLE:
-	case EXEC_PAUSE:
 	  break;
 
 	case EXEC_STOP:
@@ -14376,6 +14375,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

Reply via email to