- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello everybody,
I assume I ran into a bug with Intel Fortran 19.0.5.281. I ran into this problem writing a reference counting scheme.
The problem can be tested with this program:
MODULE Classes IMPLICIT NONE TYPE Inner_ INTEGER :: iCount=0 END TYPE TYPE Inner CLASS(Inner_), POINTER :: this => NULL() CONTAINS PROCEDURE :: init PROCEDURE :: assignMe GENERIC :: assignment(=) => assignMe FINAL :: deleteIt END TYPE TYPE user TYPE(Inner) :: mInner END TYPE CONTAINS SUBROUTINE init(self) CLASS(Inner), INTENT(OUT) :: self ALLOCATE(Inner_ :: self%this) self%this%icount=1 END SUBROUTINE SUBROUTINE deleteIt(self) TYPE(Inner) :: self IF(ASSOCIATED(self%this)) THEN self%this%icount=self%this%icount-1 IF(self%this%icount==0)DEALLOCATE(self%this) ENd IF END SUBROUTINE ELEMENTAL IMPURE SUBROUTINE assignMe(self, input) CLASS(Inner), INTENT(OUT) :: self CLASS(Inner), INTENT(IN) :: input IF(ASSOCIATED(input%this))THEN self%this=>input%this self%this%icount=self%this%icount+1 END IF END SUBROUTINE END MODULE PROGRAM test USE Classes IMPLICIT NONE WRITE(*,*)"Assign Each Element(Works as expected)" BLOCK TYPE(user) :: mOuter(2), reassigned(2) CALL mOuter(1)%mInner%init() CALL mOuter(2)%mInner%init() reassigned(1)=mOuter(1) reassigned(2)=mOuter(2) WRITE(*,*)"mOuter(1) ", mOuter(1)%mInner%this%iCount , "EXPECTING 2" WRITE(*,*)"mOuter(2) ", mOuter(2)%mInner%this%iCount , "EXPECTING 2" WRITE(*,*)"reassigned(1)", reassigned(1)%mInner%this%iCount , "EXPECTING 2" WRITE(*,*)"reassigned(2)", reassigned(2)%mInner%this%iCount , "EXPECTING 2" END BLOCK WRITE(*,*) WRITE(*,*)"Assign intrinsic vector(Does not increment reference count)" BLOCK TYPE(user) :: mOuter(2), reassigned(2) CALL mOuter(1)%mInner%init() CALL mOuter(2)%mInner%init() reassigned=mOuter WRITE(*,*)"mOuter(1) ", mOuter(1)%mInner%this%iCount , "EXPECTING 2" WRITE(*,*)"mOuter(2) ", mOuter(2)%mInner%this%iCount , "EXPECTING 2" WRITE(*,*)"reassigned(1)", reassigned(1)%mInner%this%iCount , "EXPECTING 2" WRITE(*,*)"reassigned(2)", reassigned(2)%mInner%this%iCount , "EXPECTING 2" END BLOCK END PROGRAM
The produced output is:
Assign Each Element(Works as expected)
mOuter(1) 2 EXPECTING 2
mOuter(2) 2 EXPECTING 2
reassigned(1) 2 EXPECTING 2
reassigned(2) 2 EXPECTING 2
Assign intrinsic vector(Does not increment reference count)
mOuter(1) 1 EXPECTING 2
mOuter(2) 1 EXPECTING 2
reassigned(1) 1 EXPECTING 2
reassigned(2) 1 EXPECTING 2
As it can be seen, using an element by element assignment increases the counter by calling the type bound assignment.
However using a vector assignment for the outer class does not call the type bound assignment function.
I would expect the vector assignment to be a shorthand notation for the element by element assignment. Is this correct?
Best regards
Flo
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I would expect the vector assignment to be a shorthand notation for the element by element assignment. Is this correct?
Yes. See paragraph 2 of Fortran 2018 section 10.2.1.4 (Defined Assignment).
A subroutine defines the defined assignment x1 = x2 if
... (5) either
(a) the ranks of x1 and x2 match those of d1 and d2 or
(b) the subroutine is elemental, x2 is scalar or has the same rank as x1, and there is no other
subroutine that defines the assignment.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page