- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
the following code generates an internal compiler error when compiled with 19.04
Module Mod_Paof Implicit none Private Type, Public :: parent contains Private Generic, Public :: bar => foo Procedure, Public :: foo => subfoo_parent End type parent Type, Public, extends(parent) :: offspring contains Private Procedure, Public :: foo => subfoo_offspring End type offspring Interface Module Subroutine subfoo_parent(this) Class(parent), Intent(inOut) :: this End Subroutine Module Subroutine subfoo_offspring(this) Class(offspring), Intent(inOut) :: this End Subroutine End Interface End Module Mod_Paof Submodule(Mod_Paof) parent_foo contains Module Procedure subfoo_parent Implicit None End Procedure End Submodule parent_foo Submodule(Mod_Paof) offspring_foo contains Module Procedure subfoo_offspring Implicit None End procedure End Submodule offspring_foo Module Mod_Ttt use Mod_Paof, only: offspring Implicit None Private Type, Public :: Ttt Type(offspring), allocatable :: xxx contains Private Procedure, Pass, Public :: bar=> Subbar End type Ttt Interface Module Subroutine Subbar(this) Class(Ttt), Intent(InOut) :: this End Subroutine End Interface End Module Mod_Ttt Submodule(Mod_Ttt) ttt_bar contains Module Procedure Subbar Implicit None !!ice crash call this%xxx%bar() !!workaround (not really) !call this%xxx%foo() End Procedure end Submodule Ttt_Bar
it compiles with gfortran 8.3 and ifort 17.08.
The workaround is to abandon the generic interface.
cheers
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Confirmed. Please submit a bug report. The ICE is still in the beta version ifort 2020.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
may.ka wrote:..
it compiles with gfortran 8.3 and ifort 17.08.
The workaround is to abandon the generic interface.
With the code in the original post, Intel Fortran compiler versions 18.0 Official Release, 18.0 Update 3, 18.0 Update 5, as well as 19.0 Official Release avoid the ICE and compile the code without errors. Whereas 19.0 Updates 1, 2, 3, and 4 encounter the ICE.
Another workaround is to implement the 'parent' and 'offspring' derived types in separate modules which might then help code readability and perhaps make matters easier for the compiler that then avoids the ICE while retaining the generic interface.
Module Mod_P Implicit none Private Type, Public :: parent contains Private Generic, Public :: bar => foo Procedure, Public :: foo => subfoo_parent End type parent Interface Module Subroutine subfoo_parent(this) Class(parent), Intent(inOut) :: this End Subroutine End Interface End Module Mod_P Submodule(Mod_P) parent_foo contains Module Procedure subfoo_parent Implicit None End Procedure End Submodule parent_foo Module Mod_F use Mod_P, only : parent Implicit none Private Type, Public, extends(parent) :: offspring contains Private Procedure, Public :: foo => subfoo_offspring End type offspring Interface Module Subroutine subfoo_offspring(this) Class(offspring), Intent(inOut) :: this End Subroutine End Interface End Module Mod_F Submodule(Mod_F) offspring_foo contains Module Procedure subfoo_offspring Implicit None End procedure End Submodule offspring_foo Module Mod_Ttt use Mod_F, only: offspring Implicit None Private Type, Public :: Ttt Type(offspring), allocatable :: xxx contains Private Procedure, Pass, Public :: bar=> Subbar End type Ttt Interface Module Subroutine Subbar(this) Class(Ttt), Intent(InOut) :: this End Subroutine End Interface End Module Mod_Ttt Submodule(Mod_Ttt) ttt_bar contains Module Procedure Subbar Implicit None !!ice crash at instruction below with parent and offspring in same module call this%xxx%bar() End Procedure end Submodule Ttt_Bar
C:\Temp>type ugly.f90 Module Mod_P Implicit none Private Type, Public :: parent contains Private Generic, Public :: bar => foo Procedure, Public :: foo => subfoo_parent End type parent Interface Module Subroutine subfoo_parent(this) Class(parent), Intent(inOut) :: this End Subroutine End Interface End Module Mod_P Submodule(Mod_P) parent_foo contains Module Procedure subfoo_parent Implicit None End Procedure End Submodule parent_foo Module Mod_F use Mod_P, only : parent Implicit none Private Type, Public, extends(parent) :: offspring contains Private Procedure, Public :: foo => subfoo_offspring End type offspring Interface Module Subroutine subfoo_offspring(this) Class(offspring), Intent(inOut) :: this End Subroutine End Interface End Module Mod_F Submodule(Mod_F) offspring_foo contains Module Procedure subfoo_offspring Implicit None End procedure End Submodule offspring_foo Module Mod_Ttt use Mod_F, only: offspring Implicit None Private Type, Public :: Ttt Type(offspring), allocatable :: xxx contains Private Procedure, Pass, Public :: bar=> Subbar End type Ttt Interface Module Subroutine Subbar(this) Class(Ttt), Intent(InOut) :: this End Subroutine End Interface End Module Mod_Ttt Submodule(Mod_Ttt) ttt_bar contains Module Procedure Subbar Implicit None !!ice crash at instruction below with parent and offspring in same module call this%xxx%bar() End Procedure end Submodule Ttt_Bar C:\Temp>ifort /c /standard-semantics /warn:all /stand:f18 ugly.f90 Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 19.0.4.245 Build 20190417 Copyright (C) 1985-2019 Intel Corporation. All rights reserved. ugly.f90: remark #7712: This variable has not been used. [THIS] C:\Temp>
Hopefully Intel support team has received incident request(s) on this to implement a bug resolution toward the ICE.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The ice above persists with release 19.1 (parallel studio 20.0). Intel has indicated that the bug will be fixed in "some future version".
A workaround which keeps the module-submodule structure in place is:
Module Mod_Paof Implicit none Private Type, Public :: parent contains Private !!the generic interface is the trouble maker Generic, Public :: bar => foo Procedure, Public :: foo => subfoo_parent End type parent Type, Public, extends(parent) :: offspring contains Private Procedure, Public :: foo => subfoo_offspring End type offspring Interface Module Subroutine subfoo_parent(this) Class(parent), Intent(inOut) :: this End Subroutine Module Subroutine subfoo_offspring(this) Class(offspring), Intent(inOut) :: this End Subroutine End Interface End Module Mod_Paof Submodule(Mod_Paof) parent_foo contains Module Procedure subfoo_parent Implicit None End Procedure End Submodule parent_foo Submodule(Mod_Paof) offspring_foo contains Module Procedure subfoo_offspring Implicit None End procedure End Submodule offspring_foo Module Mod_Ttt use Mod_Paof, only: offspring Implicit None Private Type, Public :: Ttt !!workaround: declare "class" instead of "type" for !!being able to do a type resolution in subbar class(offspring), allocatable :: xxx contains Private Procedure, Pass, Public :: bar=> Subbar End type Ttt Interface Module Subroutine Subbar(this) Class(Ttt), Intent(InOut) :: this End Subroutine End Interface End Module Mod_Ttt Submodule(Mod_Ttt) ttt_bar contains Module Procedure Subbar !!this use statement is redundant but when missing will cause an ICE use mod_paof, only: offspring Implicit None !!workaround: do a type resolution select type(z=>this%xxx) class is(offspring) call z%bar() end select End Procedure end Submodule Ttt_Bar program test end program test

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page