(j3.2006) Allowed but not desired?

Van Snyder Van.Snyder
Tue Oct 7 21:57:13 EDT 2014


On Wed, 2014-10-08 at 10:45 +0900, Malcolm Cohen wrote:
> Van Snyder writes:
> 
> <<<
> This appears to be allowed, but I think it's not what we want:
> >>>
> 
> Actually I think it is not allowed to be used, and I think it is harmless 
> anyway.
> 
> <<<
> module M
> 
>   type :: T1
>     type(lock_type) :: L
>   end type T1
> 
>   type :: T2
>     type(t1), allocatable :: C
>   end type T2
> 
> ...
> 
> contains
> 
>   subroutine S ( A )
>     type(t2), intent(out) :: A
> ...
> 
> This appears to be wrong, on two counts.
> 
> First, the intent of C1303 is probably that A%C%L ought to be a coarray,

"C1303" was a typo.  Should have been C1302.  C1302 says a lock variable
shall be a coarray.  No coarray in sight in the declaration of A.

> >>>
> 
> Well, I fundamentally disagree that that restriction is necessary or desirable. 
> It is a coding guideline and not a particularly good one.
> 
> <<<
> Second, A has intent(out).  The intent of C547 is that A%C%L not become
> undefined due to deallocation of A%C because A is intent(out).
> But A%C%L is not a subcomponent of A, because A%C is allocatable.
> Therefore, C547 does not apply.
> 
> Is this what we wanted?
> >>>
> 
> (1) Yes the definition of the procedure is allowed.  But it cannot be called 
> (see 3).
> 
> (2) The procedure is perfectly harmless because the lock variable is 
> allocatable.  Allocating/deallocating a lock variable needs to be known to the 
> compiler (as it might require special OS action to set it up), but it is known 
> so no problem.  We allow deallocation of lock variables, even many of them at 
> once, so no problem there.  Allocating/deallocating a lock variable is not any 
> kind of synchronisation (unless it is for some other reason e.g. the lock 
> variable being an actual coarray in itself), so no problem there.
> 
> The only problem with INTENT(OUT) comes for nonallocatable lock variables (which 
> we absolutely do not want to just become "undefined").  Which C547 prohibits. 
> So we seem to be fine on the procedure definition front.
> 
> (3) It is impossible to call subroutine S because any actual argument will 
> violate C1304.  It looks like we could modify C1304 to prohibit just the 
> problematic cases by inserting "nonallocatable" before "subobject".  But given 
> the current state and complexity of the whole LOCK_TYPE situation I don't have a 
> lot of enthusiasm for that right now.  Perhaps sometimes later when we have the 
> situation straightened out enough to be both understandable and obviously 
> correct (though that sounds a bit overoptimistic!).
> 
> Chers,





More information about the J3 mailing list