From: Thomas Koenig Date: Fri, 19 Jun 2026 15:35:37 +0000 (+0200) Subject: Remove some wrong unused warnings, do not issue warnings if there are errors. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d8da319fd0607d8035a2936da474dbb675555e8a;p=thirdparty%2Fgcc.git 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 --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 d479b6a80e5..9f1626c2949 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 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_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