Skip to content

[Flang] Preprocessor does not work correctly in if statement #115676

@ohno-fj

Description

@ohno-fj
Version of flang-new : 20.0.0(74b56c7eb807e2ba54bd7a2bcfda5d0bceff1c0c)/AArch64

Preprocessor does not work correctly in if statement.
When I look at the file (snggo785_2.i) processed by the preprocessor, lines 3, 5, and 20 are processed correctly, but line 19 is not.

For the following line

    19        if((1.e.2)/=3) print *,'error-1'

Expect to translate as follows

    19        if((1.eeeee.2)/=3) print *,'error-1'

The following are the test program, Flang-new, Gfortran and ifx compilation result.

snggo785_2.F90:

#define e eeeee
module m
  interface operator(.e.)
     module procedure ir,rr
  end interface operator(.e.)
contains
  function ir(k1,k2)
    intent(in)::k1,k2
    ir=k1+k2
  end function ir
  function rr(k1,k2)
    real,intent(in)::k1,k2
    rr=k1+k2
  end function rr
end module m

program main
  use m
  if((1.e.2)/=3) print *,'error-1'
  if(abs((1..e..2)-1.2)>0.001) print *,'error-2'
  print *,'pass'
end program main
$ flang-new snggo785_2.F90 -save-temps
error: Semantic errors in snggo785_2.i
./snggo785_2.F90:19:11: error: No operator .E. defined for INTEGER(4) and INTEGER(4)
        if((1.e.2)/=3) print *,'error-1'
            ^^^^^
$ cat snggo785_2.i -n
     1  #line "./snggo785_2.F90" 2
     2        module m
     3        interface operator(.eeeee.)
     4        module procedure ir,rr
     5        end interface operator(.eeeee.)
     6        contains
     7        function ir(k1,k2)
     8        intent(in)::k1,k2
     9        ir=k1+k2
    10        end function ir
    11        function rr(k1,k2)
    12        real,intent(in)::k1,k2
    13        rr=k1+k2
    14        end function rr
    15        end module m
    16
    17        program main
    18        use m
    19        if((1.e.2)/=3) print *,'error-1'
    20        if(abs((1..eeeee..2)-1.2)>0.001) print *,'error-2'
    21        print *,'pass'
    22        end program main
$
$ gfortran snggo785_2.F90 -save-temps
$ cat a-snggo785_2.f90 -n
     1  # 1 "snggo785_2.F90"
     2  # 1 "<built-in>"
     3  # 1 "<command-line>"
     4  # 1 "snggo785_2.F90"
     5
     6  module m
     7    interface operator(.eeeee.)
     8       module procedure ir,rr
     9    end interface operator(.eeeee.)
    10  contains
    11    function ir(k1,k2)
    12      intent(in)::k1,k2
    13      ir=k1+k2
    14    end function ir
    15    function rr(k1,k2)
    16      real,intent(in)::k1,k2
    17      rr=k1+k2
    18    end function rr
    19  end module m
    20
    21  program main
    22    use m
    23    if((1.eeeee.2)/=3) print *,'error-1'
    24    if(abs((1..eeeee..2)-1.2)>0.001) print *,'error-2'
    25    print *,'pass'
    26  end program main
$
$ ifx snggo785_2.F90 -P
$ cat snggo785_2.i90 -n
     1  # 1 "snggo785_2.F90"
     2
     3  module m
     4    interface operator(.eeeee.)
     5       module procedure ir,rr
     6    end interface operator(.eeeee.)
     7  contains
     8    function ir(k1,k2)
     9      intent(in)::k1,k2
    10      ir=k1+k2
    11    end function ir
    12    function rr(k1,k2)
    13      real,intent(in)::k1,k2
    14      rr=k1+k2
    15    end function rr
    16  end module m
    17
    18  program main
    19    use m
    20    if((1.eeeee.2)/=3) print *,'error-1'
    21    if(abs((1..eeeee..2)-1.2)>0.001) print *,'error-2'
    22    print *,'pass'
    23  end program main
$

Metadata

Metadata

Assignees

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions