Support legacy PARAMETER statements with -std=legacy.
authorFritz O. Reese <fritzoreese@gmail.com>
Thu, 3 Nov 2016 16:00:58 +0000 (16:00 +0000)
committerFritz Reese <foreese@gcc.gnu.org>
Thu, 3 Nov 2016 16:00:58 +0000 (16:00 +0000)
gcc/fortran/
* decl.c (gfc_match_parameter): Allow omitted '()' with -std=legacy.
* parse.c (decode_statement): Match "parameter" before assignments.
* gfortran.texi: Document.

gcc/testsuite/gfortran.dg/
* dec_parameter_1.f: New test.
* dec_parameter_2.f90: Likewise.
* dec_parameter_3.f90: Likewise.
* dec_parameter_4.f90: Likewise.

From-SVN: r241823

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/gfortran.texi
gcc/fortran/parse.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dec_parameter_1.f [new file with mode: 0644]
gcc/testsuite/gfortran.dg/dec_parameter_2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/dec_parameter_3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/dec_parameter_4.f90 [new file with mode: 0644]

index d47eeb05ffe879d948681144f061c810945d6acd..baec7bf3eb5bc975ba9bd07a20c5141ed7846e51 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-03  Fritz O. Reese <fritzoreese@gmail.com>
+
+       * decl.c (gfc_match_parameter): Allow omitted '()' with -std=legacy.
+       * parse.c (decode_statement): Match "parameter" before assignments.
+       * gfortran.texi: Document.
+
 2016-11-02  Fritz O. Reese <fritzoreese@gmail.com>
 
        * lang.opt, invoke.texi: New argument -Wargument-mismatch.
index f18eb41bc50f6aa51e58a870819297b216804f92..0120cebb3222ca699f6e4536cf5f8ebf30313c5c 100644 (file)
@@ -7821,10 +7821,16 @@ cleanup:
 match
 gfc_match_parameter (void)
 {
+  const char *term = " )%t";
   match m;
 
   if (gfc_match_char ('(') == MATCH_NO)
-    return MATCH_NO;
+    {
+      /* With legacy PARAMETER statements, don't expect a terminating ')'.  */
+      if (!gfc_notify_std (GFC_STD_LEGACY, "PARAMETER without '()' at %C"))
+       return MATCH_NO;
+      term = " %t";
+    }
 
   for (;;)
     {
@@ -7832,7 +7838,7 @@ gfc_match_parameter (void)
       if (m != MATCH_YES)
        break;
 
-      if (gfc_match (" )%t") == MATCH_YES)
+      if (gfc_match (term) == MATCH_YES)
        break;
 
       if (gfc_match_char (',') != MATCH_YES)
index e65c2decad2cd08d7d211cd41fcd8551b7413291..cd2c5a52575e88f9195400d46e5337927d40b8d1 100644 (file)
@@ -1471,6 +1471,7 @@ compatibility extensions along with those enabled by @option{-std=legacy}.
 * .XOR. operator::
 * Bitwise logical operators::
 * Extended I/O specifiers::
+* Legacy PARAMETER statements::
 @end menu
 
 @node Old-style kind specifications
@@ -2696,6 +2697,23 @@ supported on other systems.
 
 @end table
 
+@node Legacy PARAMETER statements
+@subsection Legacy PARAMETER statements
+@cindex PARAMETER
+
+For compatibility, GNU Fortran supports legacy PARAMETER statements without
+parentheses with @option{-std=legacy}.  A warning is emitted if used with
+@option{-std=gnu}, and an error is acknowledged with a real Fortran standard
+flag (@option{-std=f95}, etc...).  These statements take the following form:
+
+@smallexample
+implicit real (E)
+parameter e = 2.718282
+real c
+parameter c = 3.0e8
+@end smallexample
+
+
 @node Extensions not implemented in GNU Fortran
 @section Extensions not implemented in GNU Fortran
 @cindex extensions, not implemented
index 2aa2afc24e8eb361ffeafb2f6292c5622a2f1a12..0ee054a014c2e2ceed7f4c58c6a7f3f8018d016f 100644 (file)
@@ -352,6 +352,9 @@ decode_statement (void)
     }
   gfc_matching_function = false;
 
+  /* Legacy parameter statements are ambiguous with assignments so try parameter
+     first.  */
+  match ("parameter", gfc_match_parameter, ST_PARAMETER);
 
   /* Match statements whose error messages are meant to be overwritten
      by something better.  */
@@ -528,7 +531,6 @@ decode_statement (void)
 
     case 'p':
       match ("print", gfc_match_print, ST_WRITE);
-      match ("parameter", gfc_match_parameter, ST_PARAMETER);
       match ("pause", gfc_match_pause, ST_PAUSE);
       match ("pointer", gfc_match_pointer, ST_ATTR_DECL);
       if (gfc_match_private (&st) == MATCH_YES)
index 5a0467fadaa735061a96395d0dd6af1760aa9530..3b395839e1133f7f10922e12fe93fb5d05bd38b7 100644 (file)
@@ -1,3 +1,10 @@
+2016-11-03  Fritz O. Reese <fritzoreese@gmail.com>
+
+       * gfortran.dg/dec_parameter_1.f: New test.
+       * gfortran.dg/dec_parameter_2.f90: Likewise.
+       * gfortran.dg/dec_parameter_3.f90: Likewise.
+       * gfortran.dg/dec_parameter_4.f90: Likewise.
+
 2016-11-03  Martin Liska  <mliska@suse.cz>
 
        * gcc.dg/no_profile_instrument_function-attr-1.c: Update scanned
diff --git a/gcc/testsuite/gfortran.dg/dec_parameter_1.f b/gcc/testsuite/gfortran.dg/dec_parameter_1.f
new file mode 100644 (file)
index 0000000..69ffa53
--- /dev/null
@@ -0,0 +1,64 @@
+        ! { dg-do run }
+        ! { dg-options "-ffixed-form -std=legacy" }
+        !
+        ! Test DEC-style PARAMETER statements without parentheses in
+        ! fixed form.
+        !
+
+        subroutine sub1(t, x, y)
+          implicit real(8) (A-H,O-Z)
+          parameter   (pi_1 = 3.141592654d0, f_1 = 3.d08)
+          parameter    pi_2 = 3.141592654d0, f_2 = 3.d08
+          ! Note that if the parameter statements above are matched
+          ! incorrectly as assignments, the below specification
+          ! statements will be considered out-of-order and we see
+          ! 'unexpected specification statement'. A PARAMETER
+          ! statement should still be a specification statement.
+
+          real(8), intent(in) :: t
+          real(8), intent(out) :: x, y
+
+          real(8), volatile :: two
+          two = 2.0d0
+          x = two * pi_1 * f_1 * t
+          y = two * pi_2 * f_2 * t
+          z = two * pi_3 * f_3 * t
+          return
+        end subroutine
+
+        subroutine sub2(t, x, y, z)
+          implicit none
+          real(8) :: pi_1, pi_2, f_1, f_2
+                   parameter   (pi_1 = 3.141592654d0, f_1 = 3.d08)
+                   parameter    pi_2 = 3.141592654d0, f_2 = 3.d08
+          real(8), parameter :: pi_3 = 3.141592654d0, f_3 = 3.d08
+          ! Ditto sub1
+
+          real(8), intent(in) :: t
+          real(8), intent(out) :: x, y, z
+
+          real(8), volatile :: two
+          two = 2.0d0
+          x = two * pi_1 * f_1 * t
+          y = two * pi_2 * f_2 * t
+          z = two * pi_3 * f_3 * t
+        end subroutine
+
+        implicit none
+        real(8) :: x1, x2, y1, y2, z2
+        real(8), volatile :: t
+        t = 1.5e-6
+
+        call sub1(t, x1, y1)
+        call sub2(t, x2, y2, z2)
+
+        write(*,'(4D18.5)') t, x1, y1
+        write(*,'(4D18.5)') t, x2, y2, z2
+
+        if (x1 .ne. x2 .or. y1 .ne. y2
+     &      .or. x1 .ne. y1 .or. x2 .ne. y2
+     &      .or. y2 .ne. z2) then
+          call abort()
+        endif
+
+        end
diff --git a/gcc/testsuite/gfortran.dg/dec_parameter_2.f90 b/gcc/testsuite/gfortran.dg/dec_parameter_2.f90
new file mode 100644 (file)
index 0000000..280f000
--- /dev/null
@@ -0,0 +1,63 @@
+! { dg-do run }
+! { dg-options "-ffree-form -std=legacy" }
+!
+! Test DEC-style PARAMETER statements without parentheses in free form.
+!
+
+subroutine sub1(t, x, y)
+  implicit real(8) (A-H,O-Z)
+  parameter   (pi_1 = 3.141592654d0, f_1 = 3.d08)
+  parameter    pi_2 = 3.141592654d0, f_2 = 3.d08 ! legacy PARAMETER
+  ! Note that if the parameter statements above are matched
+  ! incorrectly as assignments, the below specification
+  ! statements will be considered out-of-order and we see
+  ! 'unexpected specification statement'. A PARAMETER
+  ! statement should still be a specification statement.
+
+  real(8), intent(in) :: t
+  real(8), intent(out) :: x, y
+
+  real(8), volatile :: two
+  two = 2.0d0
+  x = two * pi_1 * f_1 * t
+  y = two * pi_2 * f_2 * t
+  z = two * pi_3 * f_3 * t
+  return
+end subroutine
+
+subroutine sub2(t, x, y, z)
+  implicit none
+  real(8) :: pi_1, pi_2, f_1, f_2
+           parameter   (pi_1 = 3.141592654d0, f_1 = 3.d08)
+           parameter    pi_2 = 3.141592654d0, f_2 = 3.d08 ! legacy PARAMETER
+  real(8), parameter :: pi_3 = 3.141592654d0, f_3 = 3.d08
+  ! Ditto sub1
+
+  real(8), intent(in) :: t
+  real(8), intent(out) :: x, y, z
+
+  real(8), volatile :: two
+  two = 2.0d0
+  x = two * pi_1 * f_1 * t
+  y = two * pi_2 * f_2 * t
+  z = two * pi_3 * f_3 * t
+end subroutine
+
+implicit none
+real(8) :: x1, x2, y1, y2, z2
+real(8), volatile :: t
+t = 1.5e-6
+
+call sub1(t, x1, y1)
+call sub2(t, x2, y2, z2)
+
+write(*,'(4D18.5)') t, x1, y1
+write(*,'(4D18.5)') t, x2, y2, z2
+
+if (x1 .ne. x2 .or. y1 .ne. y2 &
+    .or. x1 .ne. y1 .or. x2 .ne. y2 &
+    .or. y2 .ne. z2) then
+  call abort()
+endif
+
+end
diff --git a/gcc/testsuite/gfortran.dg/dec_parameter_3.f90 b/gcc/testsuite/gfortran.dg/dec_parameter_3.f90
new file mode 100644 (file)
index 0000000..92f0f61
--- /dev/null
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! { dg-options "-ffree-form -std=gnu" }
+!
+! Test warnings for DEC-style PARAMETER statements with std=gnu.
+!
+
+subroutine sub()
+  implicit real(8) (A-Z)
+  parameter pi = 3.1415926535d0 ! { dg-warning "Legacy Extension: PARAMETER" }
+  print *, pi
+end subroutine
+
+end
diff --git a/gcc/testsuite/gfortran.dg/dec_parameter_4.f90 b/gcc/testsuite/gfortran.dg/dec_parameter_4.f90
new file mode 100644 (file)
index 0000000..280d56c
--- /dev/null
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! { dg-options "-ffree-form -std=f95" }
+!
+! Test errors for DEC-style PARAMETER statements with a real standard.
+!
+
+subroutine sub()
+  implicit real(8) (A-Z)
+  parameter pi = 3.1415926535d0 ! { dg-error "Legacy Extension: PARAMETER" }
+  print *, pi
+end subroutine
+
+end