Commit 1cf1719b by Fritz Reese Committed by Fritz Reese

Enable .XOR. operator with -std=legacy.

	gcc/fortran/
	* match.c (gfc_match_intrinsic_op): Match ".XOR." with -std=legacy.
	* gfortran.texi: Document.

	gcc/testsuite/gfortran.dg/
	* dec_logical_xor_1.f90: New.
        * dec_logical_xor_2.f90: New.
        * dec_logical_xor_3.f03: New.

From-SVN: r241520
parent cd714e1e
2016-10-25 Fritz Reese <fritzoreese@gmail.com> 2016-10-25 Fritz Reese <fritzoreese@gmail.com>
* match.c (gfc_match_intrinsic_op): Match ".XOR." with -std=legacy.
* gfortran.texi: Document.
2016-10-25 Fritz Reese <fritzoreese@gmail.com>
* primary.c (gfc_match_rvalue): Match %LOC as LOC with -std=legacy. * primary.c (gfc_match_rvalue): Match %LOC as LOC with -std=legacy.
* gfortran.texi: Document. * gfortran.texi: Document.
......
...@@ -1468,6 +1468,7 @@ compatibility extensions along with those enabled by @option{-std=legacy}. ...@@ -1468,6 +1468,7 @@ compatibility extensions along with those enabled by @option{-std=legacy}.
* Form feed as whitespace:: * Form feed as whitespace::
* TYPE as an alias for PRINT:: * TYPE as an alias for PRINT::
* %LOC as an rvalue:: * %LOC as an rvalue::
* .XOR. operator::
@end menu @end menu
@node Old-style kind specifications @node Old-style kind specifications
...@@ -2558,6 +2559,14 @@ integer :: i ...@@ -2558,6 +2559,14 @@ integer :: i
call sub(%loc(i)) call sub(%loc(i))
@end smallexample @end smallexample
@node .XOR. operator
@subsection .XOR. operator
@cindex operators, xor
GNU Fortran supports @code{.XOR.} as a logical operator with @code{-std=legacy}
for compatibility with legacy code. @code{.XOR.} is equivalent to
@code{.NEQV.}. That is, the output is true if and only if the inputs differ.
@node Extensions not implemented in GNU Fortran @node Extensions not implemented in GNU Fortran
@section Extensions not implemented in GNU Fortran @section Extensions not implemented in GNU Fortran
...@@ -2582,7 +2591,6 @@ code that uses them running with the GNU Fortran compiler. ...@@ -2582,7 +2591,6 @@ code that uses them running with the GNU Fortran compiler.
* Variable FORMAT expressions:: * Variable FORMAT expressions::
@c * Q edit descriptor:: @c * Q edit descriptor::
@c * TYPE and ACCEPT I/O Statements:: @c * TYPE and ACCEPT I/O Statements::
@c * .XOR. operator::
@c * CARRIAGECONTROL, DEFAULTFILE, DISPOSE and RECORDTYPE I/O specifiers:: @c * CARRIAGECONTROL, DEFAULTFILE, DISPOSE and RECORDTYPE I/O specifiers::
@c * Omitted arguments in procedure call:: @c * Omitted arguments in procedure call::
* Alternate complex function syntax:: * Alternate complex function syntax::
......
...@@ -960,6 +960,19 @@ gfc_match_intrinsic_op (gfc_intrinsic_op *result) ...@@ -960,6 +960,19 @@ gfc_match_intrinsic_op (gfc_intrinsic_op *result)
} }
break; break;
case 'x':
if (gfc_next_ascii_char () == 'o'
&& gfc_next_ascii_char () == 'r'
&& gfc_next_ascii_char () == '.')
{
if (!gfc_notify_std (GFC_STD_LEGACY, ".XOR. operator at %C"))
return MATCH_ERROR;
/* Matched ".xor." - equivalent to ".neqv.". */
*result = INTRINSIC_NEQV;
return MATCH_YES;
}
break;
default: default:
break; break;
} }
......
2016-10-25 Fritz Reese <fritzoreese@gmail.com> 2016-10-25 Fritz Reese <fritzoreese@gmail.com>
* gfortran.dg/dec_logical_xor_1.f90: New test.
* gfortran.dg/dec_logical_xor_2.f90: New test.
* gfortran.dg/dec_logical_xor_3.f03: New test.
2016-10-25 Fritz Reese <fritzoreese@gmail.com>
* gfortran.dg/dec_loc_rval_1.f90: New test. * gfortran.dg/dec_loc_rval_1.f90: New test.
* gfortran.dg/dec_loc_rval_2.f90: New test. * gfortran.dg/dec_loc_rval_2.f90: New test.
* gfortran.dg/dec_loc_rval_3.f90: New test. * gfortran.dg/dec_loc_rval_3.f03: New test.
2016-10-25 Fritz Reese <fritzoreese@gmail.com> 2016-10-25 Fritz Reese <fritzoreese@gmail.com>
......
! { dg-do run }
! { dg-options "-std=legacy" }
!
! Test logical .XOR. operator.
!
implicit none
logical :: in1, in2, neqv_out, lxor_out, truth_table(2)
integer :: i, j, ixor_out, ieor_out
truth_table(1) = .true.
truth_table(2) = .false.
do i = 1,2
do j = 1,2
in1 = truth_table(j)
in2 = truth_table(i)
! make sure logical xor works
neqv_out = in1 .neqv. in2
lxor_out = in1 .xor. in2
if ( neqv_out .neqv. lxor_out ) then
print *, "(",in1,in2,") .neqv.: ",neqv_out," .xor.: ",lxor_out
call abort()
endif
! make sure we didn't break xor() intrinsic
ixor_out = xor(i*7, j*5)
ieor_out = ieor(i*7, j*5)
if ( ixor_out .ne. ieor_out ) then
print *, "(",in1,in2,") ieor(): ",ieor_out," xor(): ",ixor_out
call abort()
endif
enddo
enddo
end
! { dg-do compile }
! { dg-options "-std=gnu" }
!
! Test warnings for logical .XOR. operator without -std=legacy.
!
implicit none
logical, volatile :: in1, in2, xor_out
xor_out = in1 .xor. in2 ! { dg-warning ".XOR. operator" }
end
! { dg-do compile }
! { dg-options "-std=f2003" }
!
! Test errors for logical .XOR. operator with a real standard.
!
implicit none
logical, volatile :: in1, in2, xor_out
xor_out = in1 .xor. in2 ! { dg-error ".XOR. operator" }
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