This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/21931] New: problem with fugly-logint flag and evaluating if statements
- From: "mark_l_hansen at yahoo dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 6 Jun 2005 15:48:14 -0000
- Subject: [Bug fortran/21931] New: problem with fugly-logint flag and evaluating if statements
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
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
--
Summary: problem with fugly-logint flag and evaluating if
statements
Product: gcc
Version: 3.4.2
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: mark_l_hansen at yahoo dot com
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21931