<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Assuming test_point and test in Intel® Fortran Compiler</title>
    <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928155#M87093</link>
    <description>&lt;P&gt;Assuming test_point and test_points are of type point and test_waypoint and test_waypoints are of type waypoint then then there is an issue resolving the generic assignment to the specific assignment procedures. One work around suggested by Kevin Davis was to add unused components to each derived type. As a temporary work around, you might try adding a component to your point type.&amp;nbsp;&lt;/P&gt;

&lt;P&gt;[fortran]type ,extends(abstract_point) :: point&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp; private real :: ifort_dpd200249796_workaround = 0.0&lt;/P&gt;

&lt;P&gt;&amp;nbsp; contains&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp; procedure :: my_assignment =&amp;gt; assign_point_to_waypoint&lt;/P&gt;

&lt;P&gt;end type [/fortran]&lt;/P&gt;

&lt;P&gt;I'd be curious to know the results of this test and to see the contents of&amp;nbsp;ifort_reproducer_140226.f90 if you are able to share them.&lt;/P&gt;</description>
    <pubDate>Wed, 26 Feb 2014 22:21:13 GMT</pubDate>
    <dc:creator>Izaak_Beekman</dc:creator>
    <dc:date>2014-02-26T22:21:13Z</dc:date>
    <item>
      <title>problem with deferred assignment overloading</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928152#M87090</link>
      <description>&lt;P&gt;I believe the code below is "legal". However, ifort (14.0.1 20131008), with default options (i.e. "ifort -c") gives this error:&lt;/P&gt;

&lt;PRE class="brush:plain;"&gt;
ifort_reproducer_140226.f90(90): error #6197: An assignment of different structure types is invalid.   [TEST_WAYPOINTS]
        test_points = test_waypoints
----------------------^
ifort_reproducer_140226.f90(91): error #6197: An assignment of different structure types is invalid.   [TEST_WAYPOINT]
        test_point = test_waypoint
---------------------^
compilation aborted for ifort_reproducer_140226.f90 (code 1)&lt;/PRE&gt;

&lt;P&gt;For what it's worth, the NAG and Portland compilers do not have a problem with this code.&lt;/P&gt;

&lt;P&gt;Is it indeed legal? If not, what is the correct way to do deferred assignment overloading?&lt;/P&gt;

&lt;P&gt;Is there a workaround for ifort?&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;
module coos
    implicit none

    type, abstract :: abstract_point
        real(kind=8)    ::  coo(3)  =   [0.0d0,0.0d0,0.0d0]
        contains
            private
            procedure(ass_abstract),    deferred        ::  my_assignment
            generic, public                             ::  assignment(=) =&amp;gt; my_assignment
    end type abstract_point

    abstract interface
        pure elemental subroutine ass_abstract(lhs,rhs)
            import :: abstract_point
            class(abstract_point),   intent(inout)      ::  lhs
            class(abstract_point),   intent(in)         ::  rhs
        end subroutine
    end interface

    type, extends(abstract_point)       ::  point
        !
        contains
            procedure                   ::  my_assignment   =&amp;gt; assign_point_to_point
    end type point

    type, extends(abstract_point)       ::  waypoint
        logical                         ::  refine      =   .true.
        real(kind=8)                    ::  path_length =   0.0d0
        contains
            procedure                   ::  my_assignment   =&amp;gt;  assign_point_to_waypoint
    end type

    contains

    pure elemental subroutine assign_point_to_point(lhs,rhs)
        ! arguments
        class(point),           intent(inout)       ::  lhs
        class(abstract_point),  intent(in)          ::  rhs
        ! start work
        lhs%coo = rhs%coo
    end subroutine assign_point_to_point

    pure elemental subroutine assign_point_to_waypoint(lhs,rhs)
        ! arguments
        class(waypoint),        intent(inout)       ::  lhs
        class(abstract_point),  intent(in)          ::  rhs
        ! start work
        lhs%coo = rhs%coo
        select type(rhs)
            class is (waypoint)
                call waypoint_assign(lhs,rhs)
        end select
    end subroutine assign_point_to_waypoint

    pure elemental subroutine waypoint_assign(wp_lhs,wp_rhs)
        ! arguments
        type(waypoint), intent(inout)   ::  wp_lhs
        type(waypoint), intent(in)      ::  wp_rhs
        ! start work
        wp_lhs%coo          =   wp_rhs%coo
        wp_lhs%path_length  =   wp_rhs%path_length
        wp_lhs%refine       =   wp_rhs%refine
    end subroutine waypoint_assign

    pure elemental subroutine waypoint_init(self)
        ! arguments
        type(waypoint),                 intent(inout)   ::  self
        ! start work
        self%coo = 0.0d0
        self%refine      =   .true.
        self%path_length =   0.0d0
    end subroutine waypoint_init


    subroutine coos_unit_test_1()
        ! private variables
        type(point),        allocatable ::  test_points(:)
        type(waypoint),     allocatable ::  test_waypoints(:)
        type(point)                     ::  test_point
        type(waypoint)                  ::  test_waypoint
        ! start work

        allocate(test_waypoints(10))
        call waypoint_init(test_waypoints)
        test_waypoints(2)%coo(1) = 12.3
        call waypoint_init(test_waypoint)
        test_waypoint%coo(1) = 12.3

        allocate(test_points(size(test_waypoints)))
        test_points = test_waypoints
        test_point = test_waypoint
    end subroutine coos_unit_test_1

end module coos
&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 26 Feb 2014 18:52:05 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928152#M87090</guid>
      <dc:creator>Alexis_R_</dc:creator>
      <dc:date>2014-02-26T18:52:05Z</dc:date>
    </item>
    <item>
      <title>I think this is the same</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928153#M87091</link>
      <description>&lt;P&gt;I think this is the same issue as in &lt;A href="http://software.intel.com/forums/topic/488776&amp;nbsp;" target="_blank"&gt;http://software.intel.com/forums/topic/488776&amp;nbsp;&lt;/A&gt;; It is our issue DPD200249796.&lt;/P&gt;</description>
      <pubDate>Wed, 26 Feb 2014 19:37:48 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928153#M87091</guid>
      <dc:creator>Steven_L_Intel1</dc:creator>
      <dc:date>2014-02-26T19:37:48Z</dc:date>
    </item>
    <item>
      <title>Thanks - I'll keep an eye out</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928154#M87092</link>
      <description>&lt;P&gt;Thanks - I'll keep an eye out for this issue.&lt;BR /&gt;
	&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 26 Feb 2014 19:40:49 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928154#M87092</guid>
      <dc:creator>Alexis_R_</dc:creator>
      <dc:date>2014-02-26T19:40:49Z</dc:date>
    </item>
    <item>
      <title>Assuming test_point and test</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928155#M87093</link>
      <description>&lt;P&gt;Assuming test_point and test_points are of type point and test_waypoint and test_waypoints are of type waypoint then then there is an issue resolving the generic assignment to the specific assignment procedures. One work around suggested by Kevin Davis was to add unused components to each derived type. As a temporary work around, you might try adding a component to your point type.&amp;nbsp;&lt;/P&gt;

&lt;P&gt;[fortran]type ,extends(abstract_point) :: point&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp; private real :: ifort_dpd200249796_workaround = 0.0&lt;/P&gt;

&lt;P&gt;&amp;nbsp; contains&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp; procedure :: my_assignment =&amp;gt; assign_point_to_waypoint&lt;/P&gt;

&lt;P&gt;end type [/fortran]&lt;/P&gt;

&lt;P&gt;I'd be curious to know the results of this test and to see the contents of&amp;nbsp;ifort_reproducer_140226.f90 if you are able to share them.&lt;/P&gt;</description>
      <pubDate>Wed, 26 Feb 2014 22:21:13 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928155#M87093</guid>
      <dc:creator>Izaak_Beekman</dc:creator>
      <dc:date>2014-02-26T22:21:13Z</dc:date>
    </item>
    <item>
      <title>Thanks Izaak for the comment.</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928156#M87094</link>
      <description>&lt;P&gt;Thanks Izaak for the comment. The content of ifort_reproducer_140226.f90 was exactly as in my post above.&lt;/P&gt;

&lt;P&gt;I have added the component as you suggested, but I am seeing the same behaviour (this is ifort 14.0.1 20131008).&lt;/P&gt;

&lt;P&gt;I attach the modified file, which includes your suggestion.&lt;/P&gt;</description>
      <pubDate>Wed, 26 Feb 2014 22:26:51 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928156#M87094</guid>
      <dc:creator>Alexis_R_</dc:creator>
      <dc:date>2014-02-26T22:26:51Z</dc:date>
    </item>
    <item>
      <title>I read your OP too quickly</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928157#M87095</link>
      <description>&lt;P&gt;I read your OP too quickly and thought you were getting a runtime error not a compile time error. The only thing that looks potentially dubious to me is declaring your procedures as [fortran] pure elemental subroutine [/fortran]. This may very well be legal F2008 (which I know added impure attribute for declaring elemental procedures, but the only place I've looked into this is in Modern Fortran Explained by MR&amp;amp;C, not the standard itself, and I can't find any mention of explicitly declaring an elemental procedure as pure) but I'm not sure about compiler support for adding the pure/impure attribute to elemental subroutines. At any rate, I couldn't find any work around for this bug.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 27 Feb 2014 16:37:05 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928157#M87095</guid>
      <dc:creator>Izaak_Beekman</dc:creator>
      <dc:date>2014-02-27T16:37:05Z</dc:date>
    </item>
    <item>
      <title>Quote:Izaak Beekman wrote:</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928158#M87096</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;Izaak Beekman wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;... The only thing that looks potentially dubious to me is declaring your procedures as&lt;/P&gt;

&lt;PRE class="brush: fortran"&gt;
 pure elemental subroutine &lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;..&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;I don't think the PURE ELEMENTAL attribute has anything to do with this.&amp;nbsp; I use it often and I do have an example of a generic assignment that works well with the underlying procedure being declared as such.&lt;/P&gt;

&lt;P&gt;In my case also, I have a concrete&amp;nbsp;type extended from an abstract type and the procedure that&amp;nbsp;implements the assignment is attributed as PURE ELEMENTAL&amp;nbsp; The only difference here is the OP is extending it one level further.&amp;nbsp; I don't think there is anything wrong with it; as Steve&amp;nbsp;indicated, this appears to&amp;nbsp;be a compiler bug.&lt;/P&gt;</description>
      <pubDate>Thu, 27 Feb 2014 19:11:22 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928158#M87096</guid>
      <dc:creator>FortranFan</dc:creator>
      <dc:date>2014-02-27T19:11:22Z</dc:date>
    </item>
    <item>
      <title>See a modified version of OP</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928159#M87097</link>
      <description>&lt;P&gt;See a modified version of OP's code example below.&amp;nbsp; This modified code is effectively similar to some code I've used extensively.&amp;nbsp;&amp;nbsp;It too gives a compiler error at line #143; a similar assignment at line 140 doesn't give an error.&amp;nbsp; I think this shows some issue within the compiler with defined assignments involving polymorphic objects:&lt;/P&gt;

&lt;P&gt;[fortran]&lt;/P&gt;

&lt;P&gt;module coos_mod&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; implicit none&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type, abstract :: abstract_point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(kind=8) :: coo(3) = [0.0d0,0.0d0,0.0d0]&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contains&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure(assign_abstract), pass(lhs), deferred :: my_assignment&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; generic, public ::&amp;nbsp; assignment(=) =&amp;gt; my_assignment&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end type abstract_point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; abstract interface&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pure elemental subroutine assign_abstract(lhs, rhs)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; import :: abstract_point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class(abstract_point), intent(inout) :: lhs&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class(*), intent(in)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: rhs&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end interface&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;end module coos_mod&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;module point_mod&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; use coos_mod, only : abstract_point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; implicit none&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type, extends(abstract_point) ::&amp;nbsp; point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;!&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; contains&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure, pass(lhs) ::&amp;nbsp; my_assignment =&amp;gt; assign_point_to_point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end type point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;contains&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pure elemental subroutine assign_point_to_point(lhs, rhs)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! arguments&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class(point), intent(inout)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: lhs&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class(*), intent(in)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: rhs&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! start work&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select type(rhs)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type is (integer(kind=4))&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lhs%coo = 0.0d0&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type is (real(kind=8))&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lhs%coo = 0.0d0&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class is (point)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lhs%coo = 0.0d0&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class default&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end select&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine assign_point_to_point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;end module point_mod&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;module waypoint_mod&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; use coos_mod, only : abstract_point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; use point_mod, only : point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; implicit none&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type, extends(abstract_point) :: waypoint&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logical&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ::&amp;nbsp; refine&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp; .true.&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real(kind=8) ::&amp;nbsp; path_length =&amp;nbsp;&amp;nbsp; 0.0d0&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; contains&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure, pass(lhs) :: my_assignment =&amp;gt; assign_point_to_waypoint&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end type&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;contains&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pure elemental subroutine assign_point_to_waypoint(lhs, rhs)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! arguments&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class(waypoint), intent(inout) :: lhs&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class(*),&amp;nbsp; intent(in)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: rhs&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! start work&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select type(rhs)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type is (integer(kind=4))&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lhs%coo = 0.0d0&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type is (real(kind=8))&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lhs%coo = 0.0d0&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class is (waypoint)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lhs%coo = 0.0d0&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call waypoint_assign(lhs, rhs)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end select&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine assign_point_to_waypoint&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pure elemental subroutine waypoint_assign(wp_lhs,wp_rhs)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! arguments&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(waypoint), intent(inout)&amp;nbsp;&amp;nbsp; ::&amp;nbsp; wp_lhs&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(waypoint), intent(in)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ::&amp;nbsp; wp_rhs&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! start work&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wp_lhs%coo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp; wp_rhs%coo&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wp_lhs%path_length&amp;nbsp; =&amp;nbsp;&amp;nbsp; wp_rhs%path_length&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wp_lhs%refine&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp; wp_rhs%refine&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine waypoint_assign&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pure elemental subroutine waypoint_init(self)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! arguments&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(waypoint),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intent(inout)&amp;nbsp;&amp;nbsp; ::&amp;nbsp; self&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! start work&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self%coo = 0.0d0&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self%refine&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp; .true.&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self%path_length =&amp;nbsp;&amp;nbsp; 0.0d0&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine waypoint_init&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;end module waypoint_mod&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;module type_int_mod&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp; implicit none&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp; type, public :: myint&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer :: i&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp; end type myint&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;end module type_int_mod&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;module test_mod&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; use point_mod, only : point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; use waypoint_mod, only : waypoint&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; use type_int_mod, only : myint&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;contains&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine testassign()&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! private variables&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(point)&amp;nbsp;&amp;nbsp;&amp;nbsp; :: test_point&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(waypoint) :: test_waypoint&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type(myint) :: t&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !..&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test_point = 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! &amp;lt;-- This works&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test_waypoint = 0.0d0&amp;nbsp; ! &amp;lt;-- This works&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !..&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t%i = 3&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test_point = t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! &amp;lt;-- This works&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test_waypoint = t&amp;nbsp; ! &amp;lt;-- This works&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !..&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test_point = test_waypoint ! &amp;lt;-- This doesn't work&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end subroutine testassign&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;end module test_mod&lt;/P&gt;

&lt;P&gt;[/fortran]&lt;/P&gt;</description>
      <pubDate>Thu, 27 Feb 2014 21:51:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928159#M87097</guid>
      <dc:creator>FortranFan</dc:creator>
      <dc:date>2014-02-27T21:51:00Z</dc:date>
    </item>
    <item>
      <title>For whatever it;s worth, the</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928160#M87098</link>
      <description>&lt;P&gt;For whatever it's worth,&amp;nbsp;the code in the original post as well as the modified one I posted in Quote #8 compile without errors in gfortran, MinGW Build 4.8.1&lt;/P&gt;</description>
      <pubDate>Fri, 28 Feb 2014 15:31:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928160#M87098</guid>
      <dc:creator>FortranFan</dc:creator>
      <dc:date>2014-02-28T15:31:00Z</dc:date>
    </item>
    <item>
      <title>Quote:FortranFan wrote:</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928161#M87099</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;FortranFan wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;&lt;STRONG&gt;Quote:&lt;/STRONG&gt;&lt;/P&gt;

&lt;BLOCKQUOTE&gt;&lt;EM&gt;Izaak Beekman&lt;/EM&gt; wrote:

	&lt;P&gt;... The only thing that looks potentially dubious to me is declaring your procedures as&lt;/P&gt;

	&lt;PRE&gt;
 pure elemental subroutine &lt;/PRE&gt;

	&lt;P&gt;&amp;nbsp;..&lt;/P&gt;

	&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;

&lt;P&gt;I don't think the PURE ELEMENTAL attribute has anything to do with this.&amp;nbsp; I use it often and I do have an example of a generic assignment that works well with the underlying procedure being declared as such.&lt;/P&gt;

&lt;P&gt;In my case also, I have a concrete&amp;nbsp;type extended from an abstract type and the procedure that&amp;nbsp;implements the assignment is attributed as PURE ELEMENTAL&amp;nbsp; The only difference here is the OP is extending it one level further.&amp;nbsp; I don't think there is anything wrong with it; as Steve&amp;nbsp;indicated, this appears to&amp;nbsp;be a compiler bug.&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;I was neither contradicting Steve's assertion that this is a compiler bug, nor was I claiming that pure elemental was the trigger of this bug. I was merely speculating that it must either be a new F2008 feature or illegal code. (I believe F2008 is when impure elemental was added, and prior to that all elemental subroutines had to be pure, and did not require the pure attribute to be explicitly added.) I have no experience with explicitly declaring elemental procedures as pure (or impure) and tend to avoid new language features which I don't really need because I worry about compiler support.&lt;/P&gt;</description>
      <pubDate>Fri, 28 Feb 2014 15:43:01 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/problem-with-deferred-assignment-overloading/m-p/928161#M87099</guid>
      <dc:creator>Izaak_Beekman</dc:creator>
      <dc:date>2014-02-28T15:43:01Z</dc:date>
    </item>
  </channel>
</rss>

