Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
28323 Discussions

ifort16: internal error using elemental intrinsics in dimension specifier


There seems to be a problem with the use of elemental intrinsic functions in the dimension specification of an derived type. The following code compiles with an internal error when an instance of a previous (erroneous) declared type is used as dummy variable .

module mdl
implicit none
  integer, parameter ::  ng=10, dp=8
  type grid_f(g_size)
    integer, len                                      ::  g_size
      real(dp), dimension(max0(2*g_size+10, g_size))  ::  val
  end type
  subroutine grid_reset(func)
  implicit none
  type(grid_f(ng))  ::  func
  end subroutine grid_reset_orb
end module mdl

The compilation gives:

ifort -c check.f90
check.f90(10): error #7974: An elemental intrinsic function here must be of type integer and each argument must be an initialization expression of type integer or character.   [MAX0]
      real(dp), dimension(max0(2*g_size+10, g_size))  ::  val
check.f90(17): internal error: Please visit '' for assistance.
  type(grid_f(ng))  ::  func
[ Aborting due to internal error. ]
compilation aborted for check.f90 (code 1)

Using jmax0 or max instead of max0 does not change the behavior. According to this site max0 takes and results in int(4) and should thus be compliant with dimension().
Any suggestions?

0 Kudos
2 Replies
Valued Contributor I

The internal error is in ifort v16 and v17, but fixed in v18 and v19. However, ifort still vetoes the code. Nagfor and gfortran accept the code. I'd have to dig into the standard to see whether the code is really compliant. If so, this should be an intel bug. 

0 Kudos
Black Belt

I agree that this code is standard-conforming. I recall seeing a similar bug with length type parameters a few months ago. Please report it to Intel. In this context, the use of MAX is in a specification expression, not a constant expression (formerly called "initialization expression").

F2008 ( says: "A type parameter may be used as a primary in a specification expression (7.1.11) in the derived-type-def ."

0 Kudos