- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I get different results depending if I comment specific lines out or not (even as those are not accessed at runtime). The bug does not appear using gfortran.
program main
implicit none
type :: parent
integer :: i1
integer, allocatable :: i2
end type
type, extends(parent) :: child
integer :: i3
integer, allocatable :: i4
end type
type :: parent_alc
class(parent), allocatable :: p
end type
type(parent_alc) :: p_alc
if (.false.) then
block
! type(child) :: e ! comment this line in/out for different results
end block
else
block
type(child) :: c
c%i1 = 1
c%i2 = 1
c%i3 = 1
c%i4 = 1
! ====================
! method 1: broken in ifort
! p_alc%p = c
! ====================
! ====================
! method 2: broken in ifort
! allocate (p_alc%p, source=c)
! ====================
! ====================
! workaround
allocate (child :: p_alc%p)
select type (x => p_alc%p)
type is (child)
x%i1 = c%i1
x%i2 = c%i2
x%i3 = c%i3
x%i4 = c%i4
end select
! =====================
c%i1 = 0
c%i2 = 0
c%i3 = 0
c%i4 = 0
end block
end if
select type (x => p_alc%p)
type is (child)
print *, 'p_alc%p%i1..4', x%i1, x%i2, x%i3, x%i4
end select
end program
Running the program using method 1,2 and commenting in/out the highlighted line 23 yields different results with ifort and the same in gfortran.
Line commented out
$ ifort main.f90 && ./a.out p_alc%p%i1..4 1 1 1 1 $ gfortran main.f90 && ./a.out p_alc%p%i1..4 1 1 1 1
Line not commented out
$ ifort main.f90 && ./a.out p_alc%p%i1..4 1 0 1 0 $ gfortran main.f90 && ./a.out p_alc%p%i1..4 1 1 1 1
Program versions
$ ifort --version ifort (IFORT) 19.0.1.144 20181018 Copyright (C) 1985-2018 Intel Corporation. All rights reserved. $ gfortran --version GNU Fortran (Arch Linux 9.3.0-1) 9.3.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
The "workaround" code actually works under ifort/gfortran with and without line 23.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
An option you may want to consider if possible is to update your compiler version. Version 19.1 appears not to face the issue:
C:\Temp>type p.f90
program main
implicit none
type :: parent
integer :: i1
integer, allocatable :: i2
end type
type, extends(parent) :: child
integer :: i3
integer, allocatable :: i4
end type
type :: parent_alc
class(parent), allocatable :: p
end type
type(parent_alc) :: p_alc
if (.false.) then
block
type(child) :: e ! comment this line in/out for different results
end block
else
block
type(child) :: c
c%i1 = 1
c%i2 = 1
c%i3 = 1
c%i4 = 1
! ====================
! method 1: broken in ifort
p_alc%p = c
end block
end if
select type (x => p_alc%p)
type is (child)
print *, 'p_alc%p%i1..4', x%i1, x%i2, x%i3, x%i4
end select
end program
C:\Temp>ifort /standard-semantics /warn:all /stand:f18 p.f90
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 19.1.0.166 Build 20191121
Copyright (C) 1985-2019 Intel Corporation. All rights reserved.
p.f90(23): remark #7712: This variable has not been used.
type(child) :: e ! comment this line in/out for different results
------------------------^
Microsoft (R) Incremental Linker Version 14.24.28316.0
Copyright (C) Microsoft Corporation. All rights reserved.
-out:p.exe
-subsystem:console
p.obj
C:\Temp>p.exe
p_alc%p%i1..4 1 1 1 1
C:\Temp>
C:\Temp>type p.f90
program main
implicit none
type :: parent
integer :: i1
integer, allocatable :: i2
end type
type, extends(parent) :: child
integer :: i3
integer, allocatable :: i4
end type
type :: parent_alc
class(parent), allocatable :: p
end type
type(parent_alc) :: p_alc
if (.false.) then
block
type(child) :: e ! comment this line in/out for different results
end block
else
block
type(child) :: c
c%i1 = 1
c%i2 = 1
c%i3 = 1
c%i4 = 1
! ====================
! method 2: broken in ifort
allocate (p_alc%p, source=c)
end block
end if
select type (x => p_alc%p)
type is (child)
print *, 'p_alc%p%i1..4', x%i1, x%i2, x%i3, x%i4
end select
end program
C:\Temp>ifort /standard-semantics /warn:all /stand:f18 p.f90
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 19.1.0.166 Build 20191121
Copyright (C) 1985-2019 Intel Corporation. All rights reserved.
p.f90(23): remark #7712: This variable has not been used.
type(child) :: e ! comment this line in/out for different results
------------------------^
Microsoft (R) Incremental Linker Version 14.24.28316.0
Copyright (C) Microsoft Corporation. All rights reserved.
-out:p.exe
-subsystem:console
p.obj
C:\Temp>p.exe
p_alc%p%i1..4 1 1 1 1
C:\Temp>
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the fast reply!
I will try it out with the newer version. Hope it works and not some internal thing caused by the underlying OS (linux/windows).
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The code in #2 is missing the trailing assignment statements necessary to see the bug - 19.1 is still problematic.
I have encountered issues previously with over-enthusiastic deallocation of block local variables (or components of block local variables) with the current compiler. I suspect that is going on here - move the block local variables up to the enclosing scope and the symptoms disappear.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
IanH (Blackbelt) wrote:The code in #2 is missing the trailing assignment statements necessary to see the bug - 19.1 is still problematic.
I have encountered issues previously with over-enthusiastic deallocation of block local variables (or components of block local variables) with the current compiler. I suspect that is going on here - move the block local variables up to the enclosing scope and the symptoms disappear.
Bummer! Support request at Intel OSC appears to be in order: https://supporttickets.intel.com/servicecenter?lang=en-US ;
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page