- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
When compiling with ifort 2017 update 1:
# ifndef matrix_algebra_F90
# define matrix_algebra_F90
module matrix_algebra
implicit none
integer,parameter::x_=8
type::vector(size)
integer,len::size
complex(kind=x_)::component(0:size)
contains
procedure,private::initialize_vector
end type vector
interface vector
module procedure vector_constructor
end interface vector
contains
subroutine initialize_vector(this,source)
implicit none
class(vector(*))::this
complex(kind=x_),intent(in),optional::source(0:this%size)
if(present(source)) then
this%component=source
else
this%component=(0.0_x_,0.0_x_)
end if!present(source)
end subroutine initialize_vector!this,source
function vector_constructor(size,source) result(that)
implicit none
integer,intent(in)::size
complex(kind=x_),intent(in),optional::source(0:size)
type(vector(size))::that
if(present(source)) then
call that%initialize_vector(source)
else
call that%initialize_vector()
end if!present(source)
end function vector_constructor!size,source
function test_constructor(vector0) result(vector_)
implicit none
type(vector(*)),intent(in)::vector0
type(vector(vector0%size))::vector_
vector_=vector(vector0%size,(0.0_x_,0.0_x_))
end function test_constructor
end module matrix_algebra
# endif
I get the following error:
matrix/snippet.F90(97): error #8725: If a type parameter does not have a default value, there must be a type parameter spec corresponding to that type parameter. [VECTOR]
vector_=vector(vector0%size,(0.0_x_,0.0_x_))
^
matrix/snippet.F90(97): error #6593: The number of expressions in a structure constructor differs from the number of components of the derived type. [VECTOR]
vector_=vector(vector0%size,(0.0_x_,0.0_x_))
--------------------------^
This disallows me from defining custom constructors, something I was aware of being able to do. I suspect that the class name is already bound by the compiler as a synthesized constructor that simply is called to at least initialize all members with no in-class initializers (default values). In that case, the compiler prevents me from creating additional constructors to the default ones (overloading the constructor). Could you please tell me what detail I am missing here? Thank you in advance for your time.
EDIT: When using constructors in the aforementioned manner in more complex code with more types and constructors, it generates a internal compiler error, but it is certain that the constructors are the culprits, as removing all constructor calls resolves the internal error. In an attempt to make the above snippet to reproduce the problem I get a normal compiler error instead, but I think it is related still.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Here's a modified version of code in the original post that addresses the 2 issues Intel Fortran compiler didn't like but it now generates an internal compiler error, at least with the Windows version. Perhaps someone can Intel can follow up on the ICE.
module matrix_algebra
implicit none
integer, parameter :: x_ = 8
type :: vector(size)
integer, len :: size = 1 !.. Introduce a default length parameter
complex(kind=x_) :: component(0:size)
contains
procedure, private :: initialize_vector
end type vector
interface vector
module procedure vector_constructor
end interface vector
contains
subroutine initialize_vector(this, source)
class(vector(size=*)) :: this
complex(kind=x_), intent(in), optional :: source(0:this%size)
if ( present(source) ) then
this%component = source
else
this%component = (0.0_x_,0.0_x_)
end if ! present(source)
end subroutine initialize_vector ! this, source
function vector_constructor( size, source ) result( that )
integer, intent(in) :: size
complex(kind=x_), intent(in), optional :: source(0:size)
type(vector(size)) :: that
if ( present(source) ) then
call that%initialize_vector( source )
else
call that%initialize_vector()
end if ! present(source)
end function vector_constructor ! size, source
function test_constructor( vector0 ) result( vector_ )
type(vector(size=*)), intent(in) :: vector0
type(vector(vector0%size)) :: vector_
vector_ = vector( vector0%size, source=[ (0.0_x_,0.0_x_) ] ) !.. Introduce a rank one array as 2nd argument
end function test_constructor
end module matrix_algebra
Compiling with Intel(R) Visual Fortran Compiler 17.0.1.143 [IA-32]... m.f90 fortcom: Fatal: There has been an internal compiler error (C0000005). ifort: error #10298: problem during post processing of parallel object compilation compilation aborted for m.f90 (code 1)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you FortranFan. I'll follow-up and report to Development.
(Internal tracking id: DPD200416899)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This is the internal compiler error I was trying to reproduce, thank you FortranFan. In my attempt to shorten the snippet, I forgot to make the proper constructor call, which would result in the internal compiler error I am also getting on Linux. Here is what I got with the fixed code (for completeness) on 2017v1 Linux version:
/tmp/ifortCXsmaT.i90: catastrophic error: **Internal compiler error: segmentation violation signal raised** 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. compilation aborted for snippet.F90 (code 1)
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page