Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
Announcements
Welcome to the Intel Community. If you get an answer you like, please mark it as an Accepted Solution to help others. Thank you!
For the latest information on Intel’s response to the Log4j/Log4Shell vulnerability, please see Intel-SA-00646

Compiler error

kolber__Michael
New Contributor I
1,835 Views

I know that my compiler is licensed, but I am not sure if we are paid for support.  I just got a compiler failure trying to use parameterized derived types.  I am going to attach the build log, which is very short.  This is just a proof of concept program.

Compiling with Intel(R) Visual Fortran Compiler 19.0.5.281 [IA-32]...
ifort /nologo /debug:full /Od /fpp /extend_source:80 /warn:none /module:"Debug\\" /object:"Debug\\" /Fd"Debug\vc150.pdb" /traceback /check:bounds /check:stack /libs:dll /threads /dbglibs /c /Qlocation,link,"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x86" /Qm32 "C:\Michael\params_test_2\Console1\Console1\bonddefinition.f90"
C:\Michael\params_test_2\Console1\Console1\$OVERRIDE.fi(29): catastrophic error: **Internal compiler error: internal abort** Please report this error along with the circumstances in which it occurred in a Software Problem Report.  Note: File and line given may not be explicit cause of this error.
Internal error store_pdtlen_data_space: Cannot find record
compilation aborted for C:\Michael\params_test_2\Console1\Console1\bonddefinition.f90 (code 1)


test_params_2 - 1 error(s), 0 warning(s)

I could not attach the html file.  So I just added the text.

 

Thanks.

0 Kudos
59 Replies
kolber__Michael
New Contributor I
679 Views

I have been following an example in the book Guide to Fortran 2008 programming

type, public ::  matrix(rows, cols, k)

integer len :: rows, cols

integer, kind :: k =kind(0.0)

real(kind = k), dimension (rows, cols) :: values

end type matrix

type (matrix =:, cols=:, k=kind(0.0)) = double) :: A

According to the technical support people  len can only be used to specify the length of character strings.  But, as you see in the above example that is not what they are doing.

 

Steve_Lionel
Black Belt Retired Employee
673 Views

A length type parameter can be used for array bounds or character lengths. The main difference between a length type parameter and a kind type parameter is that the latter is a constant and the former is evaluated at run-time when the procedure is entered. Support people aren't always current on the language, unfortunately, and PDTs, while they have been supported in Intel Fortran for a long time now, are not familiar to many.

As I wrote above, the syntax error was from your introduction of SEQUENCE in the wrong position. It is unrelated to the ICE.

mecej4
Black Belt
619 Views

Michael,

If you get the punctuation wrong even slightly, the result can be an error message that is not easy to understand. The book "Guide to Fortran 2008 Programming" by Brainerd contains some typographical errors in the relevant pages.

Here is the matrix example, massaged to make it acceptable to the Intel 2020U2 compiler:

program tst

type ::  matrix(rows, cols, k)
   integer, len :: rows, cols
   integer, kind :: k =kind(0.0)
   real(kind = k), dimension (rows, cols) :: values
end type matrix

type (matrix(2, 3, k=kind(0.0))) :: A

A%values = reshape([(i*0.5,i=1,6)],[2,3])
do i=1,2
   print '(3F8.4)',A%values(i,:)
end do
end program

You omitted the comma between integer and len .

kolber__Michael
New Contributor I
615 Views

Thanks mecej4.

 

My only other Fortran book is WatFor/WatFiv for engineers.  We are talking pre Fortran 77.  I did work for a simulator company program in Digital Fortran on Open VMS.

Steve_Lionel
Black Belt Retired Employee
607 Views

@FortranFan is correct - SEQUENCE and type parameters don't go together. I had missed that in the standard.

kolber__Michael
New Contributor I
571 Views

mecej4,

Since I know my book is not strictly correct.  I was looking at the statement that they have for allocating derived  type and this is what they have:

type(matrix(rows=:, cols-:, k=kind(0.0)), allocatable :: A

I know the number of parentheses is not correct and I fixed that.  The problem is when I allocate A I get a compiler error.  I want to allocate it by passing in variables.

Thanks,

MIchael

jimdempseyatthecove
Black Belt
562 Views

Are you using copy and paste? Or retyping your statement?

type(matrix(rows=:, cols-:, k=kind(0.0)), allocatable :: A
------------------------^   Should be =

Also, I am not an expert on parameter'd derived types, but I believe the parameters need to be parameters.

Can you explain what you are attempting to do?

Jim Dempsey

kolber__Michael
New Contributor I
560 Views

Jim,

What I am trying to do is eliminate the need to have 2 different executables of our modeling system.  One variation can do a full model and the other does a small initial run to create data to do the larger run.

When the application was created memory use was limited, so they used a compiler directive with 2 sets of parameters and tested to see which executable was being built and used that set.  I would like to be able to make use of a new parameter that flags the type of run and then create the arrays and types with the size needed based on the table of parameters.

If we could do the above we could have just one executable.

I typed in the one line, so that is definitely my mistake posting.

 

 

jimdempseyatthecove
Black Belt
547 Views
real, allocatable :: array(:,:)
...
open(10,file="inputArgs.in")
read(10,*) cols, rows
allocate(array(cols, rows))
...

sketch of untested code

You can also obtain the args from the command line, environment variables etc...

Jim Dempsey

kolber__Michael
New Contributor I
543 Views

JIm,  

I will have to take a look at that closely as we have 50 or so configuration limits.  But, the number that are build dependent are a lot less than that.

We definitely have structures that change size based on the build type.  That is why I was interested in the parameter derived types..

 

Michael

Steve_Lionel
Black Belt Retired Employee
538 Views

PDTs do generally work in Intel Fortran, which is not something I can say for gfortran (the main gfortran developer recommended avoiding PDTs when using that compiler.) But obviously there are still bugs. If you have not already, please submit a test case to Intel Support about the ICE.

Ron_Green
Moderator
679 Views

There is a bug report, CMPLRIL0-33130

and an OSC issue 04735259. 

the ICE is in 19.0.x.

and not 19.1.x nor the ifort in 2021.1 beta in oneAPI HPC Toolkit

 

Regarding the code sample in Walt's 'Guide to Fortran 2008 Programming' and other books - when the authors start to write these while the Standard is not fully ratified (but very close) and there are no fully compliant compilers.  I know Walt was doing as much early testing as he could for this one.  He usually used NAG for early testing like this.  Once the text is published and printed it's difficult to convince publishers to cut a new edition just to correct a few typos.  I'm sure it's similar for other authors and their books. 

Steve_Lionel
Black Belt Retired Employee
665 Views

Ron, I reproduced the ICE in 19.1.

Ron_Green
Moderator
653 Views

are you using the original code, or did you fix the sequence placement for override$_data ?  I am using the original:

      type override$_data(num_elements, num_groups)
      sequence
      integer*4, len  :: num_elements, num_groups
         type (date$_set) ride(mkd_)
         integer*4,  dimension(num_elements) :: number_tables
         integer*4   padding             ! ms_ is odd number
         integer*4,  dimension(num_groups) ::   first
         integer*4,  dimension(num_groups) ::  length
         integer*4,  dimension(num_groups) ::  start_date
         integer*4,  dimension(num_groups) ::  basis
         integer*4,  dimension(num_groups) ::  group
      end type

 

Also, I'm testing on mac and Linux - wondering if the Windows compiler would differ.   My -what option returns:

Intel(R) Fortran 19.1-1648

Perhaps you can attach your zip.  I've attached my reproducer with simplified names and 2 mod files, build.sh to invoke and compile.

kolber__Michael
New Contributor I
649 Views

I am running on windows.  It looks like the file you attached is a Linux file that I cannot extract from.  The file I uploaded does have the sequence in it.

I was told the specification for parameterized derived types does not allow for sequence.

mecej4
Black Belt
643 Views

A number of file archivers and archive extractors can process gzipped tar files on Windows.

I ran Ron's examples on Windows 10, using the current 19.1U2 compiler.

Q:\lang\RGreen\repro>ifort /Od /what /c mod2.f90
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 2021.1.2.254 Beta Build 20200623
Copyright (C) 1985-2020 Intel Corporation.  All rights reserved.

 Intel(R) Visual Fortran 19.1-1648
mod2.f90(13): error #8912: The type parameter declaration is incorrectly positioned within the derived-type definition.   [NUM_ELEMENTS]
      integer*4, len  :: num_elements, num_groups
-------------------------^
mod2.f90(13): error #8912: The type parameter declaration is incorrectly positioned within the derived-type definition.   [NUM_GROUPS]
      integer*4, len  :: num_elements, num_groups
---------------------------------------^
mod2.f90(32): error #7002: Error in opening the compiled module file.  Check INCLUDE paths.   [OVERRIDE]
use override
----^
mod2.f90(215): error #6457: This derived type name has not been declared.   [OVERRIDE$_DATA]
Steve_Lionel
Black Belt Retired Employee
641 Views

@Ron_Green Minimal example

D:\Projects\Console1\Console1>type bonddefinition.f90
    module override

      type override$_data(num_elements, num_groups)
      integer*4, len  :: num_elements, num_groups
         integer*4,  dimension(num_elements) :: number_tables
         integer*4,  dimension(num_groups) ::   first
      end type

      integer, public :: MS_           ! maximum number of bond series, must be odd!
      integer, public :: MTBG_         ! maximum total bond groups for dsg arrays, bond tic = average of 5 groups for 40 series

    end module override

    module bond_definition
    use override

      type , public :: b$$s
         integer*4                nbs
         type (override$_data (num_elements= ms_, num_groups=mtbg_) ):: over
      end type

      type (b$$s) :: b$s
    end module bond_definition

D:\Projects\Console1\Console1>ifort -c bonddefinition.f90
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 19.1.2.254 Build 20200623
Copyright (C) 1985-2020 Intel Corporation.  All rights reserved.

Internal error store_pdtlen_data_space: Cannot find record
bonddefinition.f90: catastrophic error: **Internal compiler error: internal abort** Please report this error along with the circumstances in which it occurred in a Software Problem Report.  Note: File and line given may not be explicit cause of this error.
compilation aborted for bonddefinition.f90 (code 1)

  

Ron_Green
Moderator
628 Views

Thanks Steve.  New bug ID CMPLRIL0-33147

kolber__Michael
New Contributor I
566 Views

Ronald,

Is the bug Id you created still open?  I know you wanted to close the support case and follow it in the community.

 

FortranFan
Honored Contributor II
552 Views

Michael,

When it comes to "Fortran community", you may want to consider participating in a growing one at https://fortran-lang.discourse.group/ where you can get further guidance on your code modernization effort.  There is also comp.lang.fortran newsgroup.

Ron_Green
Moderator
543 Views

yes, the bug is of course still open.  For the bug I have to tag it with a Forum ID or a OSC issue id or both.  I find it easiest to use 1 target origin.  That way when the bug is fixed I have but 1 place to report the fix.  Given the interest in this here, I decided the community would like to hear when a fix is ready.

Reply