Dear Andre, Thanks for the patch. As I have said to you, off list, I think that the _size field in the vtable should contain the kind information and that the _len field should carry the length of the string in bytes. I think that it is better to optimise array access this way than to avoid the division in evaluating LEN (). I am happy to accept contrary opinions from the others.
I do not believe that the bind_c issue is an issue. Your patch correctly deals with it IMHO. Subject to the above change in the value of _len, I think that your patch is OK for trunk. With best regards Paul On 4 January 2015 at 13:40, Andre Vehreschild <ve...@gmx.de> wrote: > Hi Janus, hi Paul, hi Tobias, > > Janus: During code review, I found that I had the code in > gfc_get_len_component() duplicated. So I now reintroduced and documented the > routine making is more commonly usable and added more documentation. The call > sites are now simplify.c (gfc_simplify_len) and trans-expr.c > (gfc_trans_pointer_assignment). Attached is the reworked version of the patch. > > Paul, Tobias: Can one of you have a look at line 253 of the patch? I need some > expertise on the bind_c behavior. My patch needs the check for is_bind_c added > in trans_expr.c (gfc_conv_expr) to prevent mistyping an associated variable > in a select type() during the conv. Background: This code fragment taken from > the testcase in the patch: > > MODULE m > contains > subroutine bar (arg, res) > class(*) :: arg > character(100) :: res > select type (w => arg) > type is (character(*)) > write (res, '(I2)') len(w) > end select > end subroutine > END MODULE > > has the conditions required for line trans-expr.c:6630 of gfc_conv_expr when > the associate variable w is converted. This transforms the type of the > associate variable to something unexpected in the further processing leading > to > some issues during fortraning. Janus told me, that the f90_type has been > abused > for some other things (unlimited polymorphic treatment). Although I believe > that reading the comments above the if in question, the check I had to enhance > is treating bind_c stuff (see the threads content for more). I would feel > safer > when one of you gfortran gurus can have a look and given an opinion, whether > the change is problematic. I couldn't figure why w is resolved to meet the > criteria (any ideas). Btw, all regtest are ok reporting no issues at all. > > Bootstraps and regtests ok on x86_64-linux-gnu > > Regards, > Andre > > > On Sat, 3 Jan 2015 16:45:07 +0100 > Janus Weil <ja...@gcc.gnu.org> wrote: > >> Hi Andre, >> >> >> >> For the >> >> >> second one (in gfc_conv_expr), I don't directly see how it's related >> >> >> to deferred char-len. Why is this change needed? >> >> > >> >> > That change is needed, because in some rare case where an associated >> >> > variable in a "select type ()" is used, then the type and f90_type match >> >> > the condition while them not really being in a bind_c context. Therefore >> >> > I have added the check for bind_c. Btw, I now have removed the TODO, >> >> > because that case is covered by the regression tests. >> >> >> >> I don't understand how f90_type can be BT_VOID without being in a >> >> BIND_C context, but I'm not really a ISO_C_BINDING expert. Which test >> >> case is the one that triggered this? >> > >> > This case is triggered by the test-case in the patch, where in the select >> > type (w => arg) in module m routine bar the w meets the criteria to make >> > the >> > condition become true. The type of w is then "fixed" and gfortran would >> > terminate, because the type of w would be set be and BT_INTEGER. I tried to >> > backtrace where this is coming from, but to no success. In the resolve () >> > of >> > the select type it looks all quite ok, but in the trans stage the criteria >> > are met. Most intriguing to me is, that in the condition we are talking >> > about the type of w and f90_type of the derived class' ts >> > (expr->ts.u.derived->ts.f90_type) of w is examined. But >> > expr->ts.u.derived->ts does not describe the type of w, but of the class w >> > is associate with __STAR... >> > >> > So I am not quite sure how to fix this, if this really needs fixing. When I >> > understand you right, then f90_type should only be set in a bind_c context, >> > so adding that check wouldn't hurt, right? >> >> Yes, in principle adding the check for attr.bind_c looks ok to me >> (alternatively one could also check for attr.unlimited_polymorphic). I >> think originally BT_VOID was indeed only used in a bind_c context, but >> recently it has also been 'hijacked' for unlimited polymorphism, e.g. >> for the STAR symbol and some of the components of the intrinsic vtabs. >> >> What I don't really understand is why these problems are triggered by >> your patch now and have not crept up earlier in other use-cases of >> CLASS(*). >> >> >> >> >> 3) The function 'gfc_get_len_component' that you're introducing is >> >> >> only called in a single place. Do you expect this to be useful in >> >> >> other places in the future, or could one remove the function and >> >> >> insert the code inline? >> >> > >> >> > In one of the first versions it was uses from two locations. But I had >> >> > to >> >> > remove one call site again. I am currently not sure, if I will be using >> >> > it in the patch for allocatable components when deferred char arrays are >> >> > handled. So what I do I do now? Inline it and when needed make it >> >> > explicit again in a future patch? >> >> >> >> I leave that up to you. In principle I'm fine with keeping it as it >> >> is. The only problem I see is that the function name sounds rather >> >> general, but it apparently expects the expression to be an ASSOCIATE >> >> symbol. >> > >> > I am nearly finished with the patch on allocatable scalar components and I >> > don't need the code there. Therefore I have inlined the routine. >> >> Ok, good. Could you please post an updated patch? >> >> >> > So, what do we do about the bind_c issue above? Is some bind_c guru >> > available to have a look at this? It would be very much appreciated. >> >> From my non-guru POV, it can stay as is. >> >> It would be helpful if someone like Paul or Tobias could have a look >> at the patch before it goes to trunk. I think it's pretty close to >> being ready for prime-time. Thanks for your work! >> >> Cheers, >> Janus > > > -- > Andre Vehreschild * Kreuzherrenstr. 8 * 52062 Aachen > Tel.: +49 241 9291018 * Email: ve...@gmx.de -- Outside of a dog, a book is a man's best friend. Inside of a dog it's too dark to read. Groucho Marx