- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
I have a test program which I believe is producing correct answers when compiled with ifort Version 18.0.0.128 Build 20170811 and incorrect answers when compiled with the newer ifort Version 18.0.1.163 Build 20171018. In both cases, the code compiles with no warnings or errors.
I believe the code is valid, although it is certainly possible I am misunderstanding how these features work. The problem occurs when I use a submodule to separate the implementation from the interfaces, and I have a type which extends another, and both types have a procedure with the same name. If I don't use a submodule, and put all declarations in the "contains" section, it works fine. Here is a reproducer:
!-------------------------------------------------------------------------------
! Module Model
!-------------------------------------------------------------------------------
module Model
implicit none
private
!-------------------------------------------------------------------------------
! parent_model_type
!-------------------------------------------------------------------------------
public :: parent_model_type
type :: parent_model_type
private
contains
procedure :: go
end type parent_model_type
!-------------------------------------------------------------------------------
! child_model_type
!-------------------------------------------------------------------------------
public :: child_model_type
type, extends(parent_model_type) :: child_model_type
private
contains
procedure :: go => go_child
end type child_model_type
interface
module subroutine go_child(this)
class(child_model_type) :: this
end subroutine go_child
end interface
contains
!-----------------------------------------------------------------------
! go
!-----------------------------------------------------------------------
subroutine go(this)
class(parent_model_type) :: this
print *, "Parent model is going"
end subroutine go
end module Model
!-------------------------------------------------------------------------------
! Submodule Child_Model
!-------------------------------------------------------------------------------
submodule(Model) Child_Model
implicit none
contains
!-----------------------------------------------------------------------
! go_child
!-----------------------------------------------------------------------
module subroutine go_child(this)
class(child_model_type) :: this
print *,"Child model is going"
end subroutine go_child
end submodule Child_Model
!-------------------------------------------------------------------------------
! Program test
!-------------------------------------------------------------------------------
program Test
use Model, only : parent_model_type, child_model_type
implicit none
type(parent_model_type) :: parent
type(child_model_type) :: child
call parent%go()
call child%go()
end program Test
When I run this code compiled with ifort Version 18.0.1.163 Build 20171018 I get the wrong answer:
$ ./test.exe
Parent model is going
Parent model is going
$
When I run this code compiled with ifort Version 18.0.0.128 Build 20170811 I get the correct answer:
$ ./test.exe
Parent model is going
Child model is going
$
Is this a bug in the newer 18.1.163 compiler? Or am I doing something wrong?
Thank you for your time,
Chris
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Christopher H. wrote:
.. I believe the code is valid, ..
Is this a bug in the newer 18.1.163 compiler? ..
I agree your code is valid. So I firmly believe this is a bug in update 1 to Intel Fortran compiler version 18.0, an unfortunate regression.
I suggest you submit an incident at the Intel Online Service Center (OSC):
https://supporttickets.intel.com/?lang=en-US
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you very much for the quick feedback. There is variation of this that produces a link error. I think it's very closely related to what I submitted above. If you have a child type that has a procedure which the parent does not have, the code won't link with version 18.0.1.163 Build 20171018:
!-------------------------------------------------------------------------------
! Module Model
!-------------------------------------------------------------------------------
module Model
implicit none
private
!-------------------------------------------------------------------------------
! parent_model_type
!-------------------------------------------------------------------------------
public :: parent_model_type
type :: parent_model_type
private
contains
end type parent_model_type
!-------------------------------------------------------------------------------
! child1_model_type
!-------------------------------------------------------------------------------
public :: child1_model_type
type, extends(parent_model_type) :: child1_model_type
private
contains
procedure :: go => go_child1
end type child1_model_type
interface
module subroutine go_child1(this)
class(child1_model_type) :: this
end subroutine go_child1
end interface
!-------------------------------------------------------------------------------
! child2_model_type
!-------------------------------------------------------------------------------
public :: child2_model_type
type, extends(parent_model_type) :: child2_model_type
private
contains
procedure :: go => go_child2
end type child2_model_type
interface
module subroutine go_child2(this)
class(child2_model_type) :: this
end subroutine go_child2
end interface
contains
end module Model
!-------------------------------------------------------------------------------
! Submodule Child1_Model
!-------------------------------------------------------------------------------
submodule(Model) Child1_Model
implicit none
contains
!-----------------------------------------------------------------------
! go_child1
!-----------------------------------------------------------------------
module subroutine go_child1(this)
class(child1_model_type) :: this
print *,"Child1 model is going"
end subroutine go_child1
end submodule Child1_Model
!-------------------------------------------------------------------------------
! Submodule Child2_Model
!-------------------------------------------------------------------------------
submodule(Model) Child2_Model
implicit none
contains
!-----------------------------------------------------------------------
! go_child2
!-----------------------------------------------------------------------
module subroutine go_child2(this)
class(child2_model_type) :: this
print *,"Child2 model is going"
end subroutine go_child2
end submodule Child2_Model
!-------------------------------------------------------------------------------
! Program test
!-------------------------------------------------------------------------------
program Test
use Model, only : child1_model_type, child2_model_type
implicit none
type(child1_model_type) :: child1
type(child2_model_type) :: child2
call child1%go()
call child2%go()
end program Test
ifort version 18.0.1.163 Build 20171018 produces this link error:
$ make
ifort -g -traceback -O2 -o test.exe test.f90
/tmp/ifortDczkUi.o: In function `MAIN__':
/home/Christopher.W.Harrop/test/intel_bugs/bug_2/test.f90:117: undefined reference to `model_mp_go_'
/home/Christopher.W.Harrop/test/intel_bugs/bug_2/test.f90:118: undefined reference to `model_mp_go_'
ifort version 18.0.0.128 Build 20170811 builds and runs the code correctly:
$ make
ifort -g -traceback -O2 -o test.exe test.f90
$ ./test.exe
Child1 model is going
Child2 model is going
$
Although this is a very similar scenario, the behavior is a bit different.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@Christopher H.,
I suggest you include both the cases in your incident submission at the OSC or submit two different incidents to ensure the Intel Fortran team's attention to both the issues.
Btw your second case appears similar to this other issue reported with SUBMODULEs at the Windows forum:
https://software.intel.com/en-us/node/740567#new
Sitting afar I get the impression Intel Fortran team has major difficulties developing reliable test suites with adequate coverage of features introduced in the Fortran standard since the age-old Fortran 90/95 revision. Their regression testing of new compiler versions suffers significantly as a result. SUBMODULE facility that got added starting with Fortran 2008 is but one latest example of this casualty.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you again for helping verify I'm not going crazy. Much appreciated. I will proceed with reporting both cases.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have similar problems with submodules using ifort 18.0.1 as well. Things compile and work just fine with 18.0. The amount and severity of regressions in the 2017 and 2018 versions is simply ridiculous.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi same for me.
As FortranFan said a test case would have shown this. And my OSD filed ticket for an ICE error in PSXE2018 contains such a test case... (https://software.intel.com/en-us/node/740567). There are many more here, I suggest.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page