2016-10-25 Fritz Reese <fritzoreese@gmail.com>
- * 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 <fritzoreese@gmail.com>
+
+ * primary.c (gfc_match_rvalue): Match %LOC as LOC with -std=legacy.
+ * gfortran.texi: Document.
2016-10-25 Fritz Reese <fritzoreese@gmail.com>
* Form feed as whitespace::
* TYPE as an alias for PRINT::
* %LOC as an rvalue::
+* .XOR. operator::
@end menu
@node Old-style kind specifications
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
* 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::
}
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;
}
+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_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>
--- /dev/null
+! { 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
--- /dev/null
+! { 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
--- /dev/null
+! { 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