]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Remove some wrong unused warnings, do not issue warnings if there are errors.
authorThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 19 Jun 2026 15:35:37 +0000 (17:35 +0200)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sat, 27 Jun 2026 14:42:35 +0000 (16:42 +0200)
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.

gcc/fortran/io.cc
gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/warn_unused_but_set_error_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/warn_unused_intent_out_2.f90 [new file with mode: 0644]

index 4720ea9a1f2e367a7a720845c06270877445be9a..db0d1fdce798fea2ef0360c3db165eace34bb124 100644 (file)
@@ -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)
index d479b6a80e51dbdbcee91969d29c45297ba42058..9f1626c2949e968ba23b9381b8dbdc174e47cc85 100644 (file)
@@ -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 (file)
index 0000000..f9b1520
--- /dev/null
@@ -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 (file)
index 0000000..7d0657c
--- /dev/null
@@ -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