The -fugly-logint flag allows FORTRAN to treat integers as logicals and vice versa. The following example program shows some inconsistencies in how the if statements evaluate. If you change VAR1 to 3,2,1,0,-1 and view the results you will see some interesting things. The best way to see the problem is to view the output. Thanks. I would appreciate an email if anyone has a solution/fix for the problem. Thanks. Below is the code---- Makefile: all: g77 -c -g -ff90 -ff90-intrinsics-delete -fugly-logint -fno-automatic function.for g++ -c -g main.cpp g++ -o program main.o function.o -lg2c main.cpp: #include <iostream> #include <vector> using namespace std; extern "C" { void func_(); } int main() { func_(); return 0; } function.for: SUBROUTINE FUNC IMPLICIT NONE * * LOCAL DECLARATIONS * INTEGER VAR1, VAR2 LOGICAL LVAR1, LVAR2, LOG1, LOG2 EQUIVALENCE . (VAR1, LVAR1) ., (VAR2, LVAR2) *C change VAR1 to 2,-1,0,3 and view results VAR1 = 3; VAR2 = -1; LOG1 = .true. LOG2 = .true. WRITE (*,*) "LOG1 = ", LOG1 WRITE (*,*) "LOG2 = ", LOG2 WRITE (*,*) "VAR1 = ", VAR1 WRITE (*,*) "VAR2 = ", VAR2 WRITE (*,*) "LVAR1 = ", LVAR1 WRITE (*,*) "LVAR2 = ", LVAR2 IF(.NOT.((LVAR1 .AND. LVAR2) .AND. (LOG1 .AND. LOG2))) THEN WRITE (*,*) "LOGICAL TRUE with LOG2" ELSE WRITE (*,*) "LOGICAL FALSE with LOG2" ENDIF IF(.NOT.(LVAR1 .AND. LVAR2 .AND. LOG1)) THEN WRITE (*,*) "LOGICAL TRUE with LOG1" ELSE WRITE (*,*) "LOGICAL FALSE with LOG1" ENDIF IF(.NOT.(LVAR1 .AND. LVAR2)) THEN WRITE (*,*) "LOGICAL TRUE" ELSE WRITE (*,*) "LOGICAL FALSE" ENDIF *---------------------------------------------------------------------- IF(.NOT.(VAR1 .AND. VAR2 .AND. LOG1)) THEN WRITE (*,*) "BYTE TRUE with LOG1" ELSE WRITE (*,*) "BYTE FALSE with LOG1" ENDIF IF(.NOT.(VAR1 .AND. VAR2)) THEN WRITE (*,*) "BYTE TRUE" ELSE WRITE (*,*) "BYTE FALSE" ENDIF END
Created attachment 9038 [details] Test program
the behavour of -fugly-logint changed between gcc3.2 and above. which version are you using ? --bud davis
Well, it says: "Reported against: 3.4.2"
Correct I am using version 3.4.2
here are some things i have found while researching this: First, this patch: 2002-05-09 Hassan Aurag <aurag@cae.com> * expr.c (ffeexpr_reduced_ugly2log_): Allow logicals-as-integers under -fugly-logint as arguments of .and., .or., .xor. which was then reverted after discussion about what -fugly-logint is supposed to do: 2003-11-24 Toon Moene <toon@moene.indiv.nluug.nl> PR fortran/12633 * expr.c (ffeexpr_reduced_ugly2log_): Revert change allowing logical .and. logical to be integer in expressions when -fugly-logint. And then another patch which was supposed to "do the right thing": 2004-01-13 Ian Lance Taylor <ian@wasabisystems.com> PR fortran/6491 * expr.c (ffeexpr_reduce_): When handling AND, OR, and XOR, and when using -fugly-logint, if both operands are logical, convert the result back to logical. (ffeexpr_reduced_ugly2log_): Add bothlogical parameter. Change all callers. Convert logical operands to integer.
in the interest of ensuring credit is given to who actually did the work, the above analysis was done by bbsnider@link.com and posted by me. --bud davis
I did some more research on the bug and found the following: 1) in fortran .TRUE. is 0x1 in hex 2) if(item) statements evaluate to true when the item value is non zero 3) .NOT., .AND., etc either perform bitwise or logical operations depending on what they are operating on. The problem occurs when doing bitwise operations and then doing a logical if check with the -fugly-logint flag. For example: 0xFF .AND. 0x02 = 0x02 i.e. True, but .NOT.(0xFF .AND. 0x02) = 0xFD i.e. also true when the desired result is false. I know the above might all be already understood, but I thought it might help if others are looking into the problems.
http://gcc.gnu.org/ml/gcc/2005-09/msg00266.html
won't fix for 3.4.6.