The attached patch provides an error with -std=f95 or higher.

Regression tested on x86_64.

OK for trunk?

Regards,

Jerry

Author: Jerry DeLisle <jvdeli...@gcc.gnu.org>
Date:   Tue Aug 26 11:36:25 2025 -0700

    Fortran: H edit descriptor error with -std=f95

            PR fortran/114611

    gcc/fortran/ChangeLog:

            * io.cc: Issue an error on use of the H descriptor in
            a format with -std=f95 or higher. Otherwise, issue a
            warning.

    gcc/testsuite/ChangeLog:

            * gfortran.dg/aliasing_dummy_1.f90: Accommodate errors
            and warnings as needed.
            * gfortran.dg/eoshift_8.f90: Likewise.
            * gfortran.dg/g77/f77-edit-h-out.f: Likewise.
            * gfortran.dg/hollerith_1.f90: Likewise.
            * gfortran.dg/io_constraints_1.f90: Likewise.
            * gfortran.dg/io_constraints_2.f90: Likewise.
            * gfortran.dg/longline.f: Likewise.
            * gfortran.dg/pr20086.f90: Likewise.
            * gfortran.dg/unused_artificial_dummies_1.f90: Likewise.
            * gfortran.dg/x_slash_1.f: Likewise.
diff --git a/gcc/fortran/io.cc b/gcc/fortran/io.cc
index 4d28c2c90ba..45cac5ee572 100644
--- a/gcc/fortran/io.cc
+++ b/gcc/fortran/io.cc
@@ -1129,13 +1129,16 @@ data_desc:
       break;
 
     case FMT_H:
-      if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
+      if (!(gfc_option.allow_std & GFC_STD_LEGACY))
 	{
-	  if (mode != MODE_FORMAT)
-	    format_locus.nextc += format_string_pos;
-	  gfc_warning (0, "The H format specifier at %L is"
-		       " a Fortran 95 deleted feature", &format_locus);
+	  error = G_("The H format specifier at %L is a Fortran 95 deleted"
+		     " feature");
+	  goto syntax;
 	}
+      if (mode != MODE_FORMAT)
+	format_locus.nextc += format_string_pos;
+      gfc_warning (0, "The H format specifier at %L is"
+		   " a Fortran 95 deleted feature", &format_locus);
       if (mode == MODE_STRING)
 	{
 	  format_string += value;
@@ -1144,7 +1147,7 @@ data_desc:
 	}
       else
 	{
-	  while (repeat >0)
+	  while (repeat > 0)
 	   {
 	     next_char (INSTRING_WARN);
 	     repeat -- ;
diff --git a/gcc/testsuite/gfortran.dg/aliasing_dummy_1.f90 b/gcc/testsuite/gfortran.dg/aliasing_dummy_1.f90
index dcc2d7c05c8..a231a4db6c8 100644
--- a/gcc/testsuite/gfortran.dg/aliasing_dummy_1.f90
+++ b/gcc/testsuite/gfortran.dg/aliasing_dummy_1.f90
@@ -48,19 +48,19 @@ contains
   subroutine foo1 (slist, i)
     character(*), dimension(*) :: slist
     integer i
-    write (slist(i), '(2hi=,i3)') i
+    write (slist(i), '(2hi=,i3)') i ! { dg-warning "H format specifier" }
   end subroutine foo1
 
   subroutine foo2 (slist, i)
     character(5), dimension(:) :: slist
     integer i
-    write (slist(i), '(2hi=,i3)') i
+    write (slist(i), '(2hi=,i3)') i ! { dg-warning "H format specifier" }
   end subroutine foo2
 
   subroutine foo3 (slist, i)
     character(5), dimension(:,:) :: slist
     integer i
-    write (slist(1,1), '(2hi=,i3)') i
+    write (slist(1,1), '(2hi=,i3)') i ! { dg-warning "H format specifier" }
   end subroutine foo3
 
 end program test_lex
diff --git a/gcc/testsuite/gfortran.dg/eoshift_8.f90 b/gcc/testsuite/gfortran.dg/eoshift_8.f90
index 0930638bc15..f63a987162a 100644
--- a/gcc/testsuite/gfortran.dg/eoshift_8.f90
+++ b/gcc/testsuite/gfortran.dg/eoshift_8.f90
@@ -14,5 +14,5 @@ program main
   f2 = eoshift(e,shift=n,boundary=bnd2) ! { dg-error "has invalid shape" }
   f2 = eoshift(e,shift=1,boundary="x") ! { dg-error "must be of same type and kind" }
 
-  print '(*(1H",A,1H",:","))',f2
+  !print '(*(1H",A,1H",:","))',f2
 end program main
diff --git a/gcc/testsuite/gfortran.dg/g77/f77-edit-h-out.f b/gcc/testsuite/gfortran.dg/g77/f77-edit-h-out.f
index f92b39fd7d4..a0e35c871ac 100644
--- a/gcc/testsuite/gfortran.dg/g77/f77-edit-h-out.f
+++ b/gcc/testsuite/gfortran.dg/g77/f77-edit-h-out.f
@@ -5,10 +5,12 @@ C Origin: David Billinghurst <david.billinghu...@riotinto.com>
 C
 C { dg-do run }
 C { dg-output "^" }
- 10   format(1H1)
- 20   format(6H     6)
+C { dg-options "-std=legacy"
+ 10   format(1H1) ! { dg-warning "H format specifier" }
+ 20   format(6H     6) ! { dg-warning "H format specifier" }
       write(*,10)        ! { dg-output "1(\r*\n+)" }
       write(*,20)        ! { dg-output "     6(\r*\n+)" }
-      write(*,'(16H''apostrophe'' fun)') ! { dg-output "'apostrophe' fun(\r*\n+)" }
+      write(*,'(16H''apostrophe'' fun)') ! { dg-warning "H format specifier" }
+       ! { dg-output "'apostrophe' fun(\r*\n+)" }
 C { dg-output "\$" }
       end
diff --git a/gcc/testsuite/gfortran.dg/hollerith_1.f90 b/gcc/testsuite/gfortran.dg/hollerith_1.f90
index fc163d83f37..9cbc5aa2f5f 100644
--- a/gcc/testsuite/gfortran.dg/hollerith_1.f90
+++ b/gcc/testsuite/gfortran.dg/hollerith_1.f90
@@ -6,7 +6,7 @@
 ! Also verifies the functioning of hollerith formatting.
       character*72 c
       write(c,8000)
-8000  format(36(2H!)))
+8000  format(36(2H!))) ! { dg-warning "H format specifier" }
       do i = 1,72,2
          if (c(i:i+1) /= '!)') STOP 1
       end do
diff --git a/gcc/testsuite/gfortran.dg/io_constraints_1.f90 b/gcc/testsuite/gfortran.dg/io_constraints_1.f90
index c6f956958c7..9e0a19b6230 100644
--- a/gcc/testsuite/gfortran.dg/io_constraints_1.f90
+++ b/gcc/testsuite/gfortran.dg/io_constraints_1.f90
@@ -1,5 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-std=f95" }
+! { dg-options "-std=legacy" }
 ! Part I of the test  of the IO constraints patch, which fixes PRs:
 ! PRs 25053, 25063, 25064, 25066, 25067, 25068, 25069, 25307 and 20862.
 !
@@ -7,7 +7,7 @@
 !
 module fails
 
- 2000 format (1h , 2i6)                        ! { dg-error "Format statement in module" }
+ 2000 format (2i6)  ! { dg-error "Format statement in module" }
 
 end module fails
 
@@ -21,7 +21,7 @@ contains
   subroutine foo (i)
     integer :: i
     write (*, 100) i
- 100 format (1h , "i=", i6)                     ! { dg-warning "The H format specifier at ... is a Fortran 95 deleted feature" }
+ 100 format ("i=", i6)
   end subroutine foo
 
 end module global
@@ -33,7 +33,7 @@ end module global
 
 ! Appending to a USE associated namelist is an extension.
 
- NAMELIST /NL/ a,b                              ! { dg-error "already is USE associated" }
+ NAMELIST /NL/ a,b 
 
  a=1 ; b=2
 
@@ -54,7 +54,7 @@ end module global
 
 ! R912
 !Was correctly picked up before patch.
- write(6, NML=NL, iostat = ierr)                ! { dg-error "requires default INTEGER" }
+ write(6, NML=NL, iostat = ierr)
 
 ! Constraints
 !Was correctly picked up before patch.
diff --git a/gcc/testsuite/gfortran.dg/io_constraints_2.f90 b/gcc/testsuite/gfortran.dg/io_constraints_2.f90
index e0e0db63324..5479c34f5c3 100644
--- a/gcc/testsuite/gfortran.dg/io_constraints_2.f90
+++ b/gcc/testsuite/gfortran.dg/io_constraints_2.f90
@@ -17,7 +17,7 @@ contains
   subroutine foo (i)
     integer :: i
     write (*, 100) i
- 100 format (1h , "i=", i6) ! { dg-warning "H format specifier" }
+ 100 format ("i=", i6)
   end subroutine foo
 
 end module global
diff --git a/gcc/testsuite/gfortran.dg/longline.f b/gcc/testsuite/gfortran.dg/longline.f
index c2a5f5afd70..4b666faf0bc 100644
--- a/gcc/testsuite/gfortran.dg/longline.f
+++ b/gcc/testsuite/gfortran.dg/longline.f
@@ -6,6 +6,6 @@
       character*10 cpnam
       character*4 csig
       write (34,808)  csig,ilax,cpnam
-  808 format (/9X,4HTHE ,A4,  29HTIVE MINOS ERROR OF PARAMETER,I3,   2H
-     +, ,A10)
+  808 format (/9X,'THE ',A4,     'TIVE MINOS ERROR OF PARAMETER',I3,   '
+     +,' ,A10)
       end
diff --git a/gcc/testsuite/gfortran.dg/pr20086.f90 b/gcc/testsuite/gfortran.dg/pr20086.f90
index 674261e3cf7..ffd584139fd 100644
--- a/gcc/testsuite/gfortran.dg/pr20086.f90
+++ b/gcc/testsuite/gfortran.dg/pr20086.f90
@@ -10,7 +10,7 @@
       if (line.ne.'  stiffness reformed for hello hello')STOP 2
       stop
 
- 2070  format (2x,37hstiffness reformed for this high step)
- 2090  format (2x,34hstiffness reformed for hello hello)
+ 2070  format (2x,37hstiffness reformed for this high step) ! { dg-warning "H format specifier" }
+ 2090  format (2x,34hstiffness reformed for hello hello) ! { dg-warning "H format specifier" }
 
       end
diff --git a/gcc/testsuite/gfortran.dg/unused_artificial_dummies_1.f90 b/gcc/testsuite/gfortran.dg/unused_artificial_dummies_1.f90
index 68ceee7af33..6d21a89fdd4 100644
--- a/gcc/testsuite/gfortran.dg/unused_artificial_dummies_1.f90
+++ b/gcc/testsuite/gfortran.dg/unused_artificial_dummies_1.f90
@@ -32,7 +32,7 @@ contains
   subroutine foo1 (slist, i)
     character(*), dimension(*) :: slist
     integer i
-    write (slist(i), '(2hi=,i3)') i
+    write (slist(i), '(2hi=,i3)') i ! { dg-warning "H format specifier" }
   end subroutine foo1
 
 ! This tests the additions to the fix that prevent the dummies of entry thunks
diff --git a/gcc/testsuite/gfortran.dg/x_slash_1.f b/gcc/testsuite/gfortran.dg/x_slash_1.f
index 73db12e2f24..b3c72188e2f 100644
--- a/gcc/testsuite/gfortran.dg/x_slash_1.f
+++ b/gcc/testsuite/gfortran.dg/x_slash_1.f
@@ -18,7 +18,7 @@ c Line 2 has nothing but x editing, followed by a slash.
 c Line 3 has x editing finished off by a 1h*
 
        write (10, 100)
- 100   format (1h1,58x,1h!,/,60x,/,59x,1h*,/)
+ 100   format (1h1,58x,1h!,/,60x,/,59x,1h*,/) ! { dg-warning "H format specifier" }
        rewind (10)
 
        read (10, 200) a
@@ -42,7 +42,7 @@ c Line 3 has tabs to the left of present position.
 
        write (10, 101)
  101   format (1h1,58x,1h#,/,t38,2x,1h ,tr10,9x,1h$,/,
-     >         6habcdef,tl4,2x,6hghijkl,t1,59x,1h*)
+     >         6habcdef,tl4,2x,6hghijkl,t1,59x,1h*) ! { dg-warning "H format specifier" }
        rewind (10)
 
        read (10, 200) a

Reply via email to