- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi everybody,
When accessing a function through a pointer defined by an abstract interface, I get internal compiler catastrophic error. The example code is the following:
module modl
implicit none
integer :: m
end module modl
module type_def
implicit none
type mytype
real :: a,b
integer :: n
end type mytype
end module type_def
module function_def
implicit none
abstract interface
function func(a)
use modl, only : m
use type_def, only : mytype
implicit none
class(mytype),intent(in) :: a
complex :: func(m*a%n)
end function func
end interface
procedure(func),pointer :: p => null()
contains
subroutine evaluate_fun(a)
use modl, only : m
use type_def, only : mytype
implicit none
type(mytype),intent(in) :: a
complex :: res(m*a%n)
res = p(a)
print *,' evaluate_fun: res = ',res
end subroutine evaluate_fun
subroutine set_pointer()
implicit none
p => myfunc
end subroutine set_pointer
function myfunc(a)
use type_def, only : mytype
use modl, only : m
implicit none
class(mytype),intent(in) :: a
complex :: myfunc(m*a%n)
myfunc = 1.0
end function myfunc
end module function_def
program test_catastrophic
use modl, only : m
use type_def, only : mytype
use function_def, only : set_pointer,p,evaluate_fun
implicit none
type(mytype) :: a
complex :: res(15)
a%n = 5
m = 3
call set_pointer()
call evaluate_fun(a)
res = p(a)
print *,'main program: res = ',res
end program test_catastrophic
The program reports the following error while compiling:
0_12459
: 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.
If function evaluate_fun is not present in the module function_def (and of course not called in the main program), the program compiles and runs as expected. Why does it break down when the function is accessed (through pointer p) in the module procedure, but not when accessed from the main program?
The program also runs if the function interface is changed to include m as a dummy variable, but that solution isn't easy to implement in the actual code.
The Fortran version is:
> ifort -v
ifort version 12.1.0
I would appreciate any ideas, suggestions or explanations.
Thanks,
Grgur
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I can't help you with that directly but I can tell you that your code compiles and runs on the latest compiler:
U:\>ifort t.f90
Intel(R) Visual Fortran Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 14.0.3.202 Build 20140422
Copyright (C) 1985-2014 Intel Corporation. All rights reserved.
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.
-out:t.exe
-subsystem:console
t.obj
U:\>t.exe
evaluate_fun: res = (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00) (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00) (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00) (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00) (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00)
main program: res = (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00) (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00) (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00) (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00) (1.000000,0.0000000E+00) (1.000000,0.0000000E+00)
(1.000000,0.0000000E+00)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi sgeard,
Thanks for your tip! I will see if we can get the new version of ifort installed. So no ideas what might be wrong when calling the pointer-assigned function from the same module (i.e. using evaluate_fun subroutine)?
Grgur
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You encountered a compiler bug that was fixed. It's not worthwhile to ask "what might be wrong" at this point.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Steve,
Thanks for letting me know. I was asking because I was not sure whether it's my bad coding or is it really ifort's bug.
Best,
Grgur
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
An internal compiler error is ALWAYS a compiler bug, even if it is prompted by a source error. Since sgeard reports that the program builds and runs with a current version, it's pretty likely not a source error.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks a lot for your help!
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page