Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
28996 Discussions

Generic interface with same name as derived type still not working?

miyashin
Beginner
1,074 Views

Hi,

I am trying to use generic interface with same name as derived type, but it does not work with an Intel compiler in some cases. I have read

https://software.intel.com/en-us/forums/topic/283849

https://software.intel.com/en-us/forums/topic/271401

but I am still getting errors. I have originally got the codes list.f90 and link.f90 from

https://www.pgroup.com/lit/samples/list.f90

https://www.pgroup.com/lit/samples/link.f90

to understand

4. Case Study: Data Polymorphic Linked List

https://www.pgroup.com/lit/articles/insider/v3n2a2.htm

I can compile the original codes with

/opt/pgi/linux86-64/13.2/bin/pgf90

but not with

/opt/intel/composer_xe_2013_sp1.2.144/bin/intel64/ifort

Therefore, I have simplified the code to reproduce the error. When I compile the codes link_simple.f90

module link_mod
  implicit none
  private
  public :: link, constructor
  type link
    private
    class(*), pointer :: value => null() ! value stored in link
    type(link), pointer :: next => null()! next link in list
  contains
    procedure :: nextLink    ! return next pointer
  end type link

  interface link
    module procedure constructor ! construct/initialize a link
  end interface

contains

  function nextLink(this)
    class(link) :: this
    class(link), pointer :: nextLink
    nextLink => this%next
  end function nextLink

  function constructor(value, next)
    class(link),pointer :: constructor
    class(*) :: value
    class(link), pointer :: next
    allocate(constructor)
    constructor%next => next
    allocate(constructor%value, source=value)
  end function constructor

end module link_mod

and list_simple.f90

module list_mod
  use link_mod
  implicit none
  private
  public :: list
  type list
    private
    class(link), pointer :: firstLink => null() ! first link in list
    class(link), pointer :: lastLink => null()  ! last link in list
  contains
    procedure :: addValue    ! add class(*) to linked list
  end type list

contains

  subroutine addValue(this, value)
    class(list) :: this
    class(*) :: value
    class(link), pointer :: newLink

!   newLink => link(value, this%firstLink)  ! this works
    newLink => link(value, this%lastLink%nextLink())  ! this doesn't work
!   newLink => constructor(value, this%lastLink%nextLink())  ! this works
  end subroutine addValue

end module list_mod

I get the errors

$ which ifort
/opt/apps/intel/13/composer_xe_2013.2.146/bin/intel64/ifort
$ ifort -c link_simple.f90 list_simple.f90
list_simple.f90(23): error #6292: The parent type of this field is use associated with the PRIVATE fields attribute   [VALUE]
    newLink => link(value, this%lastLink%nextLink())  ! this doesn't work
--------------------^
list_simple.f90(23): error #6292: The parent type of this field is use associated with the PRIVATE fields attribute
    newLink => link(value, this%lastLink%nextLink())  ! this doesn't work
---------------------------^
list_simple.f90(23): error #6680: A constant is not permitted in this context.
    newLink => link(value, this%lastLink%nextLink())  ! this doesn't work
---------------^
compilation aborted for list_simple.f90 (code 1)

I can compile the codes when using line 21 or 23, instead of 22, of list_simple.f90.

0 Kudos
1 Solution
Izaak_Beekman
New Contributor II
1,074 Views

I tested your code using 15.x and still getting errors with the overloaded structure constructor.  Hopefully one of the Intel folks will get back to you, because IMHO this is definitely a compiler bug.

View solution in original post

0 Kudos
6 Replies
miyashin
Beginner
1,074 Views

(I could not figure out how to edit question, so I am leaving a comment.)

I have just learned that I am supposed to write the versions of compilers as

pgf90 13.2-0 64-bit target on x86-64 Linux -tp sandybridge

and

ifort version 13.1.0

 

0 Kudos
Izaak_Beekman
New Contributor II
1,074 Views

You should try using the most up to date compiler, it may have been fixed.

0 Kudos
miyashin
Beginner
1,074 Views

I should have known this before asking question, but according to

https://software.intel.com/en-us/articles/intel-compiler-and-composer-update-version-numbers-to-compiler-version-number-mapping

the most up to date compiler is 15.0.0, which I don't have. I have realized that I can use 14.0.2, but I am still getting the same errors.

0 Kudos
Izaak_Beekman
New Contributor II
1,075 Views

I tested your code using 15.x and still getting errors with the overloaded structure constructor.  Hopefully one of the Intel folks will get back to you, because IMHO this is definitely a compiler bug.

0 Kudos
miyashin
Beginner
1,074 Views

Thank you very much for testing the codes using 15.x.

0 Kudos
Steven_L_Intel1
Employee
1,074 Views

We'll take a look.

0 Kudos
Reply