Hi Tobias,

On Fri, Apr 11, 2014 at 02:39:57PM +0200, Bernd Edlinger wrote:
> On Fri, 11 Apr 2014 13:37:46, Tobias Burnus wrote:
> Hmm,
> 
> I was hoping somehow that only that test case is broken,
> and needs to be fixed. The target attribute is somehow simple,
> it implies intent(in) and the actual value will in most cases
> be a pointer, as in the example.

I think that passing another nonpointer TARGET to a dummy argument
which has a TARGET attribute is at least as common as passing a
POINTER to a TARGET.

TARGET is roughtly the opposite to the restrict qualifier. By default
any nonpointer variable does not alias with something else, unless
it has the TARGET attribute; if it has, it (its address) can then
be assigned to a pointer. POINTER intrinsically alias and cannot
have the TARGET attribute.

> > Pointer -> Nonalloc
> > Allocatable -> Noalloc
> > Nonallocatable*/Allocatable* -> Pointer with intent(in)
> 
> Well, this approach does not handle intent(inout) at all.


Note: Intent(in) can mean two different things. For normal variables,
it means that those may not be modified at all (although, the value
 but not address of pointer components of structs [derived types]
is permitted to be changed). And for pointers, it means that the
pointer association status may not be changed (i.e. the pointer
address, allocating, deallocating) - the value of the variable to
which the pointer points to may still be modified.


> If that is possible, the changed value must be written back again.
> Are there any test cases for these conversions?

For normal variables: Sure. For polymorphic variables, I have no idea.

I am also not sure whether the value has to be written back or not; if
only the value of the address pointed to changes and not the pointer
itself (which can't in this context), everything should be fine.


In any case, I am not really happy with the way we handle polymorphic
types - and I am considering to change it when we implement the new
array descriptor.

Another issue is the handling of the restrict qualifier. GCC's
implementation is not really compatible with the Fortran standard and
gfortran's use. To fix that properly, we need Michael Matz restrict
patch ...

> > Thus, you need to handle those; gfc_expr_attr(e) should give you
> > information about the expression. Or one could always check against
> > gfc_typenode_for_spec (&fsym->ts);
> > of both fsym and e.
> >
> 
> I am not sure, does gfc_typenode_for_spec always allocate new nodes?

No idea - I had to look at the source code.

Tobias

Reply via email to