+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.
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 (;;)
{
if (m != MATCH_YES)
break;
- if (gfc_match (" )%t") == MATCH_YES)
+ if (gfc_match (term) == MATCH_YES)
break;
if (gfc_match_char (',') != MATCH_YES)
* .XOR. operator::
* Bitwise logical operators::
* Extended I/O specifiers::
+* Legacy PARAMETER statements::
@end menu
@node Old-style kind specifications
@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
}
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. */
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)
+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
--- /dev/null
+ ! { 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
--- /dev/null
+! { 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
--- /dev/null
+! { 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
--- /dev/null
+! { 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