From 35ea947ffabd427908f9fa0b5df56c6fe58176ff Mon Sep 17 00:00:00 2001 From: "Fritz O. Reese" Date: Thu, 3 Nov 2016 16:00:58 +0000 Subject: [PATCH] Support legacy PARAMETER statements with -std=legacy. 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 | 6 ++ gcc/fortran/decl.c | 10 ++- gcc/fortran/gfortran.texi | 18 ++++++ gcc/fortran/parse.c | 4 +- gcc/testsuite/ChangeLog | 7 ++ gcc/testsuite/gfortran.dg/dec_parameter_1.f | 64 +++++++++++++++++++ gcc/testsuite/gfortran.dg/dec_parameter_2.f90 | 63 ++++++++++++++++++ gcc/testsuite/gfortran.dg/dec_parameter_3.f90 | 13 ++++ gcc/testsuite/gfortran.dg/dec_parameter_4.f90 | 13 ++++ 9 files changed, 195 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/dec_parameter_1.f create mode 100644 gcc/testsuite/gfortran.dg/dec_parameter_2.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec_parameter_3.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec_parameter_4.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d47eeb05ffe..baec7bf3eb5 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-11-03 Fritz O. Reese + + * 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 * lang.opt, invoke.texi: New argument -Wargument-mismatch. diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index f18eb41bc50..0120cebb322 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -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) diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index e65c2decad2..cd2c5a52575 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -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 diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 2aa2afc24e8..0ee054a014c 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5a0467fadaa..3b395839e11 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-11-03 Fritz O. Reese + + * 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 * 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 index 00000000000..69ffa53c806 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_parameter_1.f @@ -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 index 00000000000..280f0007f93 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_parameter_2.f90 @@ -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 index 00000000000..92f0f61bb66 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_parameter_3.f90 @@ -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 index 00000000000..280d56c424f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_parameter_4.f90 @@ -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 -- 2.30.2