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