- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Dear Intel developer,
The ifort compiler (16.0.0 20150815) refuses to compile valid Fortran 2003 code if this contains overridden assignment in a polymorphic type. The self containing code below demonstrates the issue. The compiler stops with the error message
test.F90(59): error #6197: An assignment of different structure types is invalid. [MYEXT1] pExt1 = myExt1
although an assignment operator for the polymorphic variable pExt1 is defined. Other Fortran 2003 compilers seem to have no problems with it.
Best regards,
Bálint
module typedefs
implicit none
type :: Base
contains
procedure :: assignFrom => Base_assignFrom
generic :: assignment(=) => assignFrom
end type Base
type, extends(Base) :: Extended
integer :: data
contains
procedure :: assignFrom => Extended_assignFrom
end type Extended
contains
subroutine Base_assignFrom(this, other)
class(Base), intent(inout) :: this
class(Base), intent(in) :: other
select type (other)
type is (Base)
continue
class default
print *, "Wrong data type for Base%assignFrom"
error stop 1
end select
end subroutine Base_assignFrom
subroutine Extended_assignFrom(this, other)
class(Extended), intent(inout) :: this
class(Base), intent(in) :: other
select type (other)
type is (Extended)
this%data = other%data
class default
print *, "Wrong data type for Extended%assignFrom"
error stop 1
end select
end subroutine Extended_assignFrom
end module typedefs
program test
use typedefs
implicit none
type(Extended) :: myExt1
class(Base), pointer :: pExt1
myExt1%data = -1
allocate(pExt1, source=myExt1)
pExt1 = myExt1
select type (pExt1)
type is (Extended)
print *, "VALUE:", pExt1%data
class default
print *, "Unexpected type"
end select
end program test
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks, we'll take a look.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If I recall correctly, 'polymorphic assignment' is a Fortran 2008 feature that is not yet supported by Intel Fortran. Even when it does get supported, I think the generic resolution issue, similar to the other incident you posted (https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x), will remain given how you put together the Base and Extended derived types. So with polymorphic variable pExt1 declared as 'class(Base', my impression is you will still need to do along the following lines but I'm open to the possibility of being wrong about this:
program test
use typedefs
implicit none
type(Extended) :: myExt1
class(Base), pointer :: pExt1
myExt1%data = -1
allocate(pExt1, source=myExt1)
select type (pExt1)
type is (Extended)
pExt1 = myExt1
print *, "VALUE:", pExt1%data
class default
print *, "Unexpected type"
end select
end program test
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The assignment to an allocatable polymorphic variable is indeed Fortran 2008. However, here we have an assignment to a static polymorphic variable and that is Fortran 2003, as far as I know. I can not point out the part in the standard, but I've checked it also with another commercial compiler which I have found the most reliable so far when in doubt about the standard, and it compiles the code in F2003 mode.
Also, thanks for the workaround, but that won't help in my situation, as in my application I can not know the possible types in advance. I would like to implement a general purpose container holding arbitrary extensions of a given derived type with user overridden assignments.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Intrinsic assignment to a polymorphic variable is not standard F2003:
17 An intrinsic assignment statement is an assignment statement that is not a defined assignment 18 statement (7.4.1.4). In an intrinsic assignment statement, variable shall not be polymorphic, and 19 (1) If expr is an array then variable shall also be an array, 20 (2) Either variable shall be an allocatable array of the same rank as expr or the shapes of 21 variable and expr shall conform, and (3) The declared types of variable 1 and expr shall conform as specified in Table 7.8.
However, this is defined assignment which is not so restricted.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you for the clarification! I've changed the title of the thread to contain the correct wording.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Escalated as issue DPD200409351. I will update this thread when there is news.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Apparently this thread was never updated but this is definitely fixed now in recent versions of ifort.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Not fixed in 17.07 and 18.03
Cheers
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Wait, my check wasn't proper: apparently it _is_ fixed in ifort v19beta!
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page