MVBITS again
Daniel Kraft
d@domob.eu
Sat Oct 25 08:44:00 GMT 2008
Hi Paul,
thanks for your help here so far!
Paul Richard Thomas wrote:
>> While this now creates a temporary for the output array, the output is still
>> wrong as MVBITS wants an INTENT(*INOUT*) argument and the created temporary
>> does not take over the initial values on creation. It seems to me like a
>> bug in gfc_conv_elemental_dependencies, as this should indeed be done for
>> INTENT(*INOUT*), shouldn't it? So my question, do you think it's ok to fix
>> this there in general or is it done the way it is at the moment for some
>> reason I'm missing at the moment, so that I must not "fix" this behaviour?
>
> I don't see why not. It's not a bug because, until now, only
> INTENT(OUT) arrived there; from interface assignements.
I already suspected this, and investigated here a bit. So far I've come
up with an experimental solution of using internal_pack for copying the
data into the temporary. I tried to manipulate internal_pack such that
it can optionally pack into a buffer passed as argument, not return the
packed data. This worked and should be possible to change (and I
believe this new internal_pack functionality could be generally useful)
and compiled FX's test from comment #1 without parentheses fine.
However, I'm not sure if we want to change the library that way now (and
at least we should version the new internal_pack function, right?
If it would be fine to do so and someone can give me some hints on how
to do the versioning, I should be able to post a patch to fix this half
of PR 35681 in a few days.
On the other hand, I also tried to do front-end only changes such that I
can use the existing internal_pack as-is, by extending the
gfc_trans_create_temp_array method to allow initializing the created
temporary to some value (as we want here) and, if that's the case, call
internal_pack and let it allocate and return the storage to use; I'm not
completely sure about the details and I got it all right so far, but in
general this seems to work, also.
The only problem is that internal_pack does only allocate a new array
and pack into it if the argument is not already packed in which case
that one is simply returned. This does not make much sense to me (from
a certain POV at least); how should be caller know if he is to
deallocate the memory when he's done? Can I somehow force internal_pack
to allocate and copy? Or at least do I have a way to find out if the
array was already packed to I can do the allocation and copying myself?
I believe both solutions should work more or less equally well and both
have certain advantages (making some functionality available that could
be interesting in general, like the temporary initialization?) and
drawbacks (like the ABI breakage / need for versioning). What do you
think I should go for?
Thanks,
Daniel
PS: Jerry and Tobias, I CC'ed you because I think those library/ABI
related things could be interesting for you, too, and you could probably
help here with comments.
--
Done: Arc-Bar-Cav-Rog-Sam-Val-Wiz
To go: Hea-Kni-Mon-Pri-Ran-Tou
More information about the Fortran
mailing list