Commit 35ea947f by Fritz O. Reese Committed by Fritz Reese

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
parent c0ae959b
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.
......
......@@ -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)
......
......@@ -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
......
......@@ -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)
......
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
......
! { 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
! { 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
! { 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
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment