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

Reply via email to