diff mbox series

[Fortran] Suppress unclassifiable statement error message

Message ID 20190102015624.GA18496@troutmask.apl.washington.edu
State New
Headers show
Series [Fortran] Suppress unclassifiable statement error message | expand

Commit Message

Steve Kargl Jan. 2, 2019, 1:56 a.m. UTC
Due to the nuances of issuing error messages with ieee_selected_real_kind
when used in an initialization expression, it became painfully obvious
that gfortran will often issue an "Unclassifiable statement" error
as a run-on error.  I tried to make the "Unclassifiable ..." error a
fatal error, but there is at least one case were the US error is 
emitted before a useful error message.  So, as a compromise I have
elected to make emitting a US error conditional on whether any other
error has been emitted.  Patch tested on i586-*-freebsd.  OK to commit?

2019-01-01  Steven G. Kargl  <kargl@gcc.gnu.org>

	* parse.c (decode_statement):  Suppress "Unclassifiable statement"
	error if previous error messages were emitted.
 
2019-01-01  Steven G. Kargl  <kargl@gcc.gnu.org>
 
	* gfortran.dg/argument_checking_7.f90: Remove run-on error message.
	* gfortran.dg/dec_d_lines_3.f: Ditto.
	* gfortran.dg/dec_structure_24.f90: Ditto.
	* gfortran.dg/dec_structure_26.f90: Ditto.
	* gfortran.dg/dec_structure_27.f90: Ditto.
	* gfortran.dg/dec_type_print_3.f90: Ditto.
	* gfortran.dg/derived_name_1.f90: Ditto.
	* gfortran.dg/error_recovery_1.f90: Ditto.
	* gfortran.dg/gomp/pr29759.f90: Ditto.
	* gfortran.dg/pr36192.f90: Ditto.
	* gfortran.dg/pr56007.f90: Ditto.
	* gfortran.dg/pr56520.f90: Ditto.
	* gfortran.dg/pr78741.f90: Ditto.
	* gfortran.dg/print_fmt_2.f90: Ditto.
	* gfortran.dg/select_type_20.f90: Ditto.

Comments

Thomas Koenig Jan. 2, 2019, 10:45 a.m. UTC | #1
Hi Steve,

> Due to the nuances of issuing error messages with ieee_selected_real_kind
> when used in an initialization expression, it became painfully obvious
> that gfortran will often issue an "Unclassifiable statement" error
> as a run-on error.  I tried to make the "Unclassifiable ..." error a
> fatal error, but there is at least one case were the US error is
> emitted before a useful error message.  So, as a compromise I have
> elected to make emitting a US error conditional on whether any other
> error has been emitted.  Patch tested on i586-*-freebsd.  OK to commit?

Good idea!  OK for trunk, and thanks.

Regards

	Thomas
diff mbox series

Patch

Index: gcc/fortran/parse.c
===================================================================
--- gcc/fortran/parse.c	(revision 267487)
+++ gcc/fortran/parse.c	(working copy)
@@ -587,10 +587,16 @@  decode_statement (void)
     }
 
   /* All else has failed, so give up.  See if any of the matchers has
-     stored an error message of some sort.  */
-
+     stored an error message of some sort.  Suppress the "Unclassifiable
+     statement" if a previous error message was emitted, e.g., by
+     gfc_error_now ().  */
   if (!gfc_error_check ())
-    gfc_error_now ("Unclassifiable statement at %C");
+    {
+      int ecnt;
+      gfc_get_errors (NULL, &ecnt);
+      if (ecnt <= 0)
+        gfc_error_now ("Unclassifiable statement at %C");
+    }
 
   reject_statement ();
 
Index: gcc/testsuite/gfortran.dg/argument_checking_7.f90
===================================================================
--- gcc/testsuite/gfortran.dg/argument_checking_7.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/argument_checking_7.f90	(working copy)
@@ -12,7 +12,7 @@  module cyclic
       character(len(y)-1) ouch ! { dg-error "used before it is typed" }
       integer i
       do i = 1, len(ouch)
-        ouch(i:i) = achar(ieor(iachar(x(i:i)),iachar(y(i:i)))) ! { dg-error "Unclassifiable statement" }
+        ouch(i:i) = achar(ieor(iachar(x(i:i)),iachar(y(i:i))))
       end do
       end function ouch
 end module cyclic
Index: gcc/testsuite/gfortran.dg/dec_d_lines_3.f
===================================================================
--- gcc/testsuite/gfortran.dg/dec_d_lines_3.f	(revision 267487)
+++ gcc/testsuite/gfortran.dg/dec_d_lines_3.f	(working copy)
@@ -9,6 +9,4 @@ 
 include 'dec_d_lines_2.f'
 
 ! { dg-error "character in statement label" " " { target *-*-*} 6 }
-! { dg-error "Unclassifiable statement" " " { target *-*-*} 6 }
 ! { dg-error "character in statement label" " " { target *-*-*} 7 }
-! { dg-error "Unclassifiable statement" " " { target *-*-*} 7 }
Index: gcc/testsuite/gfortran.dg/dec_structure_24.f90
===================================================================
--- gcc/testsuite/gfortran.dg/dec_structure_24.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/dec_structure_24.f90	(working copy)
@@ -12,10 +12,6 @@  include 'dec_structure_1.f90'
 ! { dg-error "Expecting END PROGRAM" " " { target *-*-* } 19 }
 ! { dg-error "-fdec-structure" " " { target *-*-* } 21 }
 ! { dg-error "-fdec-structure" " " { target *-*-* } 22 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 25 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 26 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 27 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 28 }
 ! { dg-error "is not a variable" " " { target *-*-* } 30 }
 ! { dg-error "Bad character" " " { target *-*-* } 32 }
 ! { dg-error "Expecting END PROGRAM" " " { target *-*-* } 34 }
Index: gcc/testsuite/gfortran.dg/dec_structure_26.f90
===================================================================
--- gcc/testsuite/gfortran.dg/dec_structure_26.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/dec_structure_26.f90	(working copy)
@@ -14,10 +14,6 @@  include 'dec_structure_1.f90'
 ! { dg-error "Expecting END PROGRAM" " " { target *-*-* } 19 }
 ! { dg-error "-fdec-structure" " " { target *-*-* } 21 }
 ! { dg-error "-fdec-structure" " " { target *-*-* } 22 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 25 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 26 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 27 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 28 }
 ! { dg-error "is not a variable" " " { target *-*-* } 30 }
 ! { dg-error "Bad character" " " { target *-*-* } 32 }
 ! { dg-error "Expecting END PROGRAM" " " { target *-*-* } 34 }
Index: gcc/testsuite/gfortran.dg/dec_structure_27.f90
===================================================================
--- gcc/testsuite/gfortran.dg/dec_structure_27.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/dec_structure_27.f90	(working copy)
@@ -14,10 +14,6 @@  include 'dec_structure_1.f90'
 ! { dg-error "Expecting END PROGRAM" " " { target *-*-* } 19 }
 ! { dg-error "-fdec-structure" " " { target *-*-* } 21 }
 ! { dg-error "-fdec-structure" " " { target *-*-* } 22 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 25 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 26 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 27 }
-! { dg-error "Unclassifiable statement" " " { target *-*-* } 28 }
 ! { dg-error "is not a variable" " " { target *-*-* } 30 }
 ! { dg-error "Bad character" " " { target *-*-* } 32 }
 ! { dg-error "Expecting END PROGRAM" " " { target *-*-* } 34 }
Index: gcc/testsuite/gfortran.dg/dec_type_print_3.f90
===================================================================
--- gcc/testsuite/gfortran.dg/dec_type_print_3.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/dec_type_print_3.f90	(working copy)
@@ -15,7 +15,6 @@  include 'dec_type_print.f90'
 ! { dg-error "Invalid character in name" "" { target *-*-* } 56 }
 ! { dg-error "Invalid character in name" "" { target *-*-* } 57 }
 ! { dg-error "Invalid character in name" "" { target *-*-* } 58 }
-! { dg-error "Unclassifiable statement" "" { target *-*-* } 59 }
 ! { dg-error "conflicts with PROCEDURE" "" { target *-*-* } 60 }
 ! { dg-error "Cannot assign to a named constant" "" { target *-*-* } 80 }
 
Index: gcc/testsuite/gfortran.dg/derived_name_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/derived_name_1.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/derived_name_1.f90	(working copy)
@@ -7,9 +7,9 @@  type complex ! { dg-error "cannot be the same as an in
 type character ! { dg-error "cannot be the same as an intrinsic type" }
 type logical ! { dg-error "cannot be the same as an intrinsic type" }
 type complex ! { dg-error "cannot be the same as an intrinsic type" }
-type double precision ! { dg-error "Unclassifiable statement" }
+type double precision
 type doubleprecision ! { dg-error "cannot be the same as an intrinsic type" }
-type double complex ! { dg-error "Unclassifiable statement" }
+type double complex
 type doublecomplex ! { dg-error "cannot be the same as an intrinsic type" }
 
 type x
Index: gcc/testsuite/gfortran.dg/error_recovery_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/error_recovery_1.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/error_recovery_1.f90	(working copy)
@@ -10,6 +10,6 @@  module gfcbug29_import
 end module gfcbug29_import
 
 subroutine FOO
-    X :: I ! { dg-error "Unclassifiable statement" }
+    X :: I
     equivalence (I,I)
 end
Index: gcc/testsuite/gfortran.dg/gomp/pr29759.f90
===================================================================
--- gcc/testsuite/gfortran.dg/gomp/pr29759.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/gomp/pr29759.f90	(working copy)
@@ -22,21 +22,21 @@  PROGRAM test_omp
 
 
 !$OMP PARALLEL &		! { dg-error "Unclassifiable OpenMP" }
-!$    NUM_THREADS(2)		! { dg-error "Unclassifiable|Invalid character" }
+!$    NUM_THREADS(2)
 !$OMP END PARALLEL		! { dg-error "Unexpected" }
 
 !$OMP PARALLEL &		! { dg-error "Unclassifiable OpenMP" }
-!$    & NUM_THREADS(2)		! { dg-error "Unclassifiable|Invalid character" }
+!$    & NUM_THREADS(2)		! { dg-error "Invalid character" }
 !$OMP END PARALLEL		! { dg-error "Unexpected" }
 
 !$OMP PARALLEL &		! { dg-error "Unclassifiable OpenMP" }
 !
-!$    NUM_THREADS(2)		! { dg-error "Unclassifiable|Invalid character" }
+!$    NUM_THREADS(2)
 !$OMP END PARALLEL		! { dg-error "Unexpected" }
 
 !$OMP PARALLEL &		! { dg-error "Unclassifiable OpenMP" }
 !
-!$    & NUM_THREADS(2)		! { dg-error "Unclassifiable|Invalid character" }
+!$    & NUM_THREADS(2)		! { dg-error "Invalid character" }
 !$OMP END PARALLEL		! { dg-error "Unexpected" }
 
 END PROGRAM
Index: gcc/testsuite/gfortran.dg/pr36192.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr36192.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/pr36192.f90	(working copy)
@@ -4,5 +4,5 @@ 
 program three_body
   real, parameter :: n = 2, d = 2
   real, dimension(n,d) :: x  ! { dg-error "Expecting a scalar INTEGER" }
-  x(1,:) = (/ 1.0, 0.0 /)    ! { dg-error "Unclassifiable" }
+  x(1,:) = (/ 1.0, 0.0 /)
 end program three_body
Index: gcc/testsuite/gfortran.dg/pr56007.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr56007.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/pr56007.f90	(working copy)
@@ -5,7 +5,7 @@ 
   integer iw1(90), doiw1(90)
   do iw1=1,2     ! { dg-error "cannot be an array" }
   end do         ! { dg-error "Expecting END PROGRAM statement" }
-  do iw1(1)=1    ! { dg-error "Unclassifiable statement" }
+  do iw1(1)=1
   do iw1=1       ! { dg-error "cannot be an array" }
   end do         ! { dg-error "Expecting END PROGRAM statement" }
 END program
Index: gcc/testsuite/gfortran.dg/pr56520.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr56520.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/pr56520.f90	(working copy)
@@ -6,8 +6,8 @@  program misleading
     real a, c
     a = 1.0
     c = exp(+a) )    ! { dg-error "Unclassifiable statement" }
-    c = exp(-a) )    ! { dg-error "Unclassifiable statement" }
-    c = exp((a)) )   ! { dg-error "Unclassifiable statement" }
-    c = exp(a) )     ! { dg-error "Unclassifiable statement" }
+    c = exp(-a) )
+    c = exp((a)) )
+    c = exp(a) )
     c = exp(a)
 end program misleading
Index: gcc/testsuite/gfortran.dg/pr78741.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr78741.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/pr78741.f90	(working copy)
@@ -11,6 +11,6 @@  entry g(n, x)           ! { dg-error "is already defin
    x = 'b'
 contains
    subroutine g         ! { dg-error "(1)" }
-      z(1) = x(1:1) ! { dg-error "Unclassifiable statement" }
+      z(1) = x(1:1)
    end
 end
Index: gcc/testsuite/gfortran.dg/print_fmt_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/print_fmt_2.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/print_fmt_2.f90	(working copy)
@@ -7,5 +7,5 @@  real  x
 namelist /mynml/ x
 printf, "check" ! { dg-error "Unclassifiable" }
 x = 1
-printmynml ! { dg-error "" }
+printmynml
 end
Index: gcc/testsuite/gfortran.dg/select_type_20.f90
===================================================================
--- gcc/testsuite/gfortran.dg/select_type_20.f90	(revision 267487)
+++ gcc/testsuite/gfortran.dg/select_type_20.f90	(working copy)
@@ -15,21 +15,21 @@  module gfcbug111
 
 contains
 
-  function my_dot_v_v (this,a,b) ! { dg-error "has no IMPLICIT type" }
+  function my_dot_v_v (this,a,b)       ! { dg-error "has no IMPLICIT type" }
     class(trivial_inner_product_type), intent(in) :: this
     class(vector_class),               intent(in) :: a,b ! { dg-error "Derived type" }
     real :: my_dot_v_v
 
-    select type (a)
-    class is (trivial_vector_type) ! { dg-error "Syntax error in CLASS IS" }
-       select type (b) ! { dg-error "Expected TYPE IS" }
-       class is (trivial_vector_type) ! { dg-error "Syntax error in CLASS IS" }
+    select type (a)                    ! { dg-error "Selector shall be polymorphic" }
+    class is (trivial_vector_type)     ! { dg-error "Syntax error in CLASS IS" }
+       select type (b)                 ! { dg-error "Expected TYPE IS" }
+       class is (trivial_vector_type)  ! { dg-error "Syntax error in CLASS IS" }
        class default
        end select
-    class default ! { dg-error "Unclassifiable statement" }
+    class default 
     end select ! { dg-error "Expecting END FUNCTION" }
   end function my_dot_v_v
 end module gfcbug111
 
 select type (a)
-! { dg-excess-errors "Unexpected end of file" }
+! { dg-prune-output "Unexpected end of file" }