https://gcc.gnu.org/g:d8da319fd0607d8035a2936da474dbb675555e8a
commit r17-1932-gd8da319fd0607d8035a2936da474dbb675555e8a Author: Thomas Koenig <[email protected]> Date: Fri Jun 19 17:35:37 2026 +0200 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_intent_out_2.f90: New test. Diff: --- gcc/fortran/io.cc | 2 ++ gcc/fortran/resolve.cc | 15 ++++++++++----- .../gfortran.dg/warn_unused_but_set_error_1.f90 | 8 ++++++++ .../gfortran.dg/warn_unused_intent_out_2.f90 | 21 +++++++++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/gcc/fortran/io.cc b/gcc/fortran/io.cc index 4720ea9a1f2e..db0d1fdce798 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 d479b6a80e51..9f1626c2949e 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -11769,6 +11769,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 @@ -11901,10 +11905,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); - } @@ -21000,7 +21000,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 000000000000..f9b152051002 --- /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_intent_out_2.f90 b/gcc/testsuite/gfortran.dg/warn_unused_intent_out_2.f90 new file mode 100644 index 000000000000..7d0657cd5612 --- /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
