title: Syntax error on line if (m <= 0 .or. n <= 0) return
body: <p>When I compile the following file with <code>f2c</code>, it fails with a noninformative syntax error message</p>
  
  <pre><code>f2c  &lt; ../../libcruft/blas-xtra/ddot3.f &gt;ddot3.c
     ddot3:
  Error on line 37: syntax error
  </code></pre>
  
  <p><code>gfortran</code> 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 <code>f2c</code> and have good error messages?</p>
  
  <p>The file in question:</p>
  
  <pre><code>c Copyright (C) 2009-2012  VZLU Prague, a.s., Czech Republic
  c
  c Author: Jaroslav Hajek &lt;highegg@gmail.com&gt;
  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 &lt;http://www.gnu.org/licenses/&gt;.
  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 &lt;= 0 .or. n &lt;= 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
  </code></pre>