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.
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

Reply via email to