[patch, fortran] Remove some wrong unused warnings, do not issue warnings if there are errors.
Thomas Koenig <[email protected]> Fri, 19 Jun 2026 17:37:29 +0200
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.fortran |
|---|---|
| Message-ID | <[email protected]> |
Hello world, the attached patch implements the discussion about not issuing the new warnings if there are previous errors, and also fixes two cases where wrong warnings were issued. Regression-tested. OK for trunk? Best regards Thomas Remove some wrong unused warnings, do not issue warnings if there are errors. This patch fixes to omissions when variables were not set as referenced and removes the warnings if errors have previously been issued. gcc/fortran/ChangeLog: PR fortran/30438 PR fortran/125801 * io.cc (gfc_resolve_dt): Set internal unit as used on read.o * resolve.cc (resolve_transfer): Move setting value as used before possible early return. (gfc_resolve): Only call warn_unused_vs_set if there are no pending errors. gcc/testsuite/ChangeLog: PR fortran/30438 PR fortran/125801 * gfortran.dg/warn_unused_but_set_error_1.f90: New test. * gfortran.dg/warn_unused_but_set_error_1.s: New test. * gfortran.dg/warn_unused_intent_out_2.f90: New test.
p1.diff
(text/x-patch, 3 KB)
diff --git a/gcc/fortran/io.cc b/gcc/fortran/io.cc
index 4720ea9a1f2..db0d1fdce79 100644
--- a/gcc/fortran/io.cc
+++ b/gcc/fortran/io.cc
@@ -3412,6 +3412,8 @@ gfc_resolve_dt (gfc_code *dt_code, gfc_dt *dt, locus *loc)
gfc_expr_set_at (e, &e->where, VALUE_VARDEF);
}
+ else
+ gfc_value_used_expr (e, VALUE_USED);
}
if (e->rank && e->ts.type != BT_CHARACTER)
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 74d2b20ca9d..2be91dbad97 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -11761,6 +11761,10 @@ resolve_transfer (gfc_code *code)
return;
}
+ if (dt && (dt->dt_io_kind->value.iokind == M_WRITE
+ || dt->dt_io_kind->value.iokind == M_PRINT))
+ gfc_value_used_expr (exp, VALUE_USED);
+
if (exp == NULL || (exp->expr_type != EXPR_VARIABLE
&& exp->expr_type != EXPR_FUNCTION
&& exp->expr_type != EXPR_ARRAY
@@ -11893,10 +11897,6 @@ resolve_transfer (gfc_code *code)
return;
}
- if (dt && (dt->dt_io_kind->value.iokind == M_WRITE
- || dt->dt_io_kind->value.iokind == M_PRINT))
- gfc_value_used_expr (exp, VALUE_USED);
-
}
@@ -20977,7 +20977,12 @@ gfc_resolve (gfc_namespace *ns)
if (warn_unused_but_set_variable || warn_unused_intent_out
|| warn_unused_read || warn_undefined_vars)
- warn_unused_vs_set (ns);
+ {
+ int error_count;
+ gfc_get_errors (NULL, &error_count);
+ if (error_count == 0)
+ warn_unused_vs_set (ns);
+ }
if (ns->omp_assumes)
gfc_resolve_omp_assumptions (ns->omp_assumes);
diff --git a/gcc/testsuite/gfortran.dg/warn_unused_but_set_error_1.f90 b/gcc/testsuite/gfortran.dg/warn_unused_but_set_error_1.f90
new file mode 100644
index 00000000000..f9b15205100
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/warn_unused_but_set_error_1.f90
@@ -0,0 +1,8 @@
+! { dg-do compile }
+! { dg-options "-Wundefined-vars -Wunused-but-set-variable" }
+! Make sure that no warning are emitted after an error.
+program main
+ real :: a, b
+ b = sum(a) ! { dg-error "must be an array" }
+end program main
+
diff --git a/gcc/testsuite/gfortran.dg/warn_unused_but_set_error_1.s b/gcc/testsuite/gfortran.dg/warn_unused_but_set_error_1.s
new file mode 100644
index 00000000000..18ffff7d6bf
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/warn_unused_but_set_error_1.s
@@ -0,0 +1 @@
+ .file "warn_unused_but_set_error_1.f90"
diff --git a/gcc/testsuite/gfortran.dg/warn_unused_intent_out_2.f90 b/gcc/testsuite/gfortran.dg/warn_unused_intent_out_2.f90
new file mode 100644
index 00000000000..7d0657cd561
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/warn_unused_intent_out_2.f90
@@ -0,0 +1,21 @@
+! { dg-do compile }
+! { dg-options "-Wunused-intent-out" }
+! PR fortran/125801 - no warnings should be emitted here.
+
+subroutine unused_1
+ character(len=20) c_val
+ integer val
+
+ CALL getarg(1,c_val)
+ READ(c_val,*) val
+ print*,val
+end subroutine unused_1
+
+subroutine unused_2
+
+ INTEGER t1,t2
+ CALL SYSTEM_CLOCK(t1)
+ CALL sleep(1)
+ CALL SYSTEM_CLOCK(t2)
+ print*,"Ende: ",(t2-t1)/1000.0
+end subroutine unused_2