Search code examples
compiler-errorssyntax-errorgfortranfortran77f2c

Syntax error on line if (m <= 0 .or. n <= 0) return


When I compile the following file with f2c, it fails with a noninformative syntax error message

f2c  < ../../libcruft/blas-xtra/ddot3.f >ddot3.c
   ddot3:
Error on line 37: syntax error

gfortran compiles it without any error. Do you have an idea what can cause it? Do you know of any fortran compiler that would be strict as f2c and have good error messages?

The file in question:

c Copyright (C) 2009-2012  VZLU Prague, a.s., Czech Republic
c
c Author: Jaroslav Hajek <[email protected]>
c
c This file is part of Octave.
c
c Octave is free software; you can redistribute it and/or modify
c it under the terms of the GNU General Public License as published by
c the Free Software Foundation; either version 3 of the License, or
c (at your option) any later version.
c
c This program is distributed in the hope that it will be useful,
c but WITHOUT ANY WARRANTY; without even the implied warranty of
c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c GNU General Public License for more details.
c
c You should have received a copy of the GNU General Public License
c along with this software; see the file COPYING.  If not, see
c <http://www.gnu.org/licenses/>.
c
      subroutine ddot3(m,n,k,a,b,c)
c purpose:      a 3-dimensional dot product.
c               c = sum (a .* b, 2), where a and b are 3d arrays.
c arguments:
c m,n,k (in)    the dimensions of a and b
c a,b (in)      double prec. input arrays of size (m,k,n)
c c (out)       double prec. output array, size (m,n)
      integer m,n,k,i,j,l
      double precision a(m,k,n),b(m,k,n)
      double precision c(m,n)

      double precision ddot
      external ddot


c quick return if possible.
      if (m <= 0 .or. n <= 0) return

      if (m == 1) then
c the column-major case.
        do j = 1,n
          c(1,j) = ddot(k,a(1,1,j),1,b(1,1,j),1)
        end do
      else
c We prefer performance here, because that's what we generally
c do by default in reduction functions. Besides, the accuracy
c of xDOT is questionable. Hence, do a cache-aligned nested loop.
        do j = 1,n
          do i = 1,m
            c(i,j) = 0d0
          end do
          do l = 1,k
            do i = 1,m
              c(i,j) = c(i,j) + a(i,l,j)*b(i,l,j)
            end do
          end do
        end do
      end if

      end subroutine

Solution

  • I believe that f2c expects to read FORTRAN77 and the line

    if (m <= 0 .or. n <= 0) return
    

    uses a token (ie <=) that was introduced in Fortran 90. Try changing the line to

    if (m .le. 0 .or. n .le. 0) return
    

    I expect that if this fixes the problem f2c will next complain about == which is also a Fortran 90 introduction.

    Do not read on if you are a fan of f2c.

    As for Do you know of any fortran compiler that would be strict as f2c and have good error messages? you're joking right ? f2c is an outdated pile of insert your favourite term of moderate-to-severe disapproval here which was probably a bad idea back in 1990 when it was first published. Now that interoperability between Fortran and C is (a) standardised and (b) easier than ever before I see no good reason for using it.