On Sat, Jul 11, 2015 at 12:54:33PM +0200, Mikael Morin wrote:
> Le 10/07/2015 20:57, Steve Kargl a ?crit :
> > On Fri, Jul 10, 2015 at 06:20:47PM +0200, Mikael Morin wrote:
> >>
> >> I'm not completely convinced by the standard excerpts that have been
> >> quoted about this topic, as they don't have any explicit mention of
> >> allocatable variables/expressions.
> > 
> > I did not quote 12.3.3 about "characteristics of function results",
> > which mentions the allocatable attribute.  But, that is not 
> > necessarily relevant.  The pieces I quoted explicitly states
> > 
> >    "On completion of execution of the function, the value returned
> >     is that of its function result. ... If the function result is
> >     not a pointer, its value shall be defined by the function."
> Yeah, well, if the standard committee had allowed unallocated
> allocatable results, they would have put it here together with pointer,
> I guess.
> 

>From F95, 6.3.1.1.  "An allocatable array that has been allocated 
by an ALLOCATE statement and has not been subsequently deallocated
(6.3.3) is currently allocated and is definable."

Note it is "definable".  It is not defined.

I cannot find a similar statement in F08 due to the massive 
rewrite of the standard to accommodate new features (e.g.,
co-arrays and allocation-on-assignment).  F08 6.7.1.3 does
say

  The allocation status of an allocatable entity is one of the
  following at any time.

  * The status of an allocatable variable becomes "allocated" if
    it is allocated by and ALLOCATE statement, if it allocated
    during assignment, or if it is given that status by the 
    intrinsic subroutine MOVE_ALLOC (13.7.118).  An allocatable
    variable with this status my be referenced, defined, or 
    deallocated; ...

  * An allocatable variable has a status of "unallocated" if it
    is not allocated.  The status of an allocatable variable 
    becomes unallocated if it is deallocated (6.7.3) or if it is
    given that status by the allocation transfer procedure.

So, change my example to what you want

module foo
   contains
   function bar(i)
      integer, allocatable :: bar
      integer, intent(in) :: i
      if (i > 0) bar = i
   end function bar
end module foo

program test
   use foo
   integer, allocatable :: j
   j = bar( 3); if (allocated(j)) print *, j
   j = bar(-3); if (allocated(j)) print *, j
end program test

So, it seems you want the allocation status of j in 'j = bar(-3)'
to be unallocated due to the "allocation-on-assignment" feature
of f08.  I'll simply note that *there is no assignment* as bar(-3)
does not return an a value, which is required by
 
  If the function result is not a pointer, its value shall be
  defined by the function.

So, you want unallocation-on-nonassignment, which is not in the
standard.

-- 
steve

Reply via email to