From 1cf1719bc07ade2e96d47c7bae00d1203c847ee0 Mon Sep 17 00:00:00 2001 From: Fritz Reese Date: Tue, 25 Oct 2016 15:30:51 +0000 Subject: [PATCH] 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 --- gcc/fortran/ChangeLog | 9 ++++- gcc/fortran/gfortran.texi | 10 ++++- gcc/fortran/match.c | 13 ++++++ gcc/testsuite/ChangeLog | 8 +++- .../gfortran.dg/dec_logical_xor_1.f90 | 40 +++++++++++++++++++ .../gfortran.dg/dec_logical_xor_2.f90 | 12 ++++++ .../gfortran.dg/dec_logical_xor_3.f03 | 12 ++++++ 7 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_xor_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_xor_2.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_xor_3.f03 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9bd1d805d59..c6a07e92241 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,7 +1,12 @@ 2016-10-25 Fritz Reese - * primary.c (gfc_match_rvalue): Match %LOC as LOC with -std=legacy. - * gfortran.texi: Document. + * match.c (gfc_match_intrinsic_op): Match ".XOR." with -std=legacy. + * gfortran.texi: Document. + +2016-10-25 Fritz Reese + + * primary.c (gfc_match_rvalue): Match %LOC as LOC with -std=legacy. + * gfortran.texi: Document. 2016-10-25 Fritz Reese diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index e1256bd8824..60b619f71a9 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -1468,6 +1468,7 @@ compatibility extensions along with those enabled by @option{-std=legacy}. * Form feed as whitespace:: * TYPE as an alias for PRINT:: * %LOC as an rvalue:: +* .XOR. operator:: @end menu @node Old-style kind specifications @@ -2558,6 +2559,14 @@ integer :: i call sub(%loc(i)) @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 @section Extensions not implemented in GNU Fortran @@ -2582,7 +2591,6 @@ code that uses them running with the GNU Fortran compiler. * Variable FORMAT expressions:: @c * Q edit descriptor:: @c * TYPE and ACCEPT I/O Statements:: -@c * .XOR. operator:: @c * CARRIAGECONTROL, DEFAULTFILE, DISPOSE and RECORDTYPE I/O specifiers:: @c * Omitted arguments in procedure call:: * Alternate complex function syntax:: diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 236231e3ee6..94aa830acd3 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -960,6 +960,19 @@ gfc_match_intrinsic_op (gfc_intrinsic_op *result) } 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: break; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 33a99136e59..78a9bdab8a8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,8 +1,14 @@ +2016-10-25 Fritz Reese + + * 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 * gfortran.dg/dec_loc_rval_1.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 diff --git a/gcc/testsuite/gfortran.dg/dec_logical_xor_1.f90 b/gcc/testsuite/gfortran.dg/dec_logical_xor_1.f90 new file mode 100644 index 00000000000..d10fa19892a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_logical_xor_1.f90 @@ -0,0 +1,40 @@ +! { 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 diff --git a/gcc/testsuite/gfortran.dg/dec_logical_xor_2.f90 b/gcc/testsuite/gfortran.dg/dec_logical_xor_2.f90 new file mode 100644 index 00000000000..4e43179f868 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_logical_xor_2.f90 @@ -0,0 +1,12 @@ +! { 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 diff --git a/gcc/testsuite/gfortran.dg/dec_logical_xor_3.f03 b/gcc/testsuite/gfortran.dg/dec_logical_xor_3.f03 new file mode 100644 index 00000000000..ff029fc8f0c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_logical_xor_3.f03 @@ -0,0 +1,12 @@ +! { 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 -- 2.30.2