Dear Andre, Don't worry about the lack of a laptop. I am on to it :-)
Paul On 17 January 2015 at 16:14, Andre Vehreschild <ve...@gmx.de> wrote: > Dear Paul, > > Setting _Len to one by default should be quite simple. When I remember > correctly, then there is only one place where the current code sets it to > zero. Could be in gfc_conv_structure but that is only a guess. > Unfortunately am I on travel 'till Sunday and don't have my laptop with me. > Sorry for that. > > Regards, > Andre > > Andre Vehreschild * Kreuzherrenstr. 8 * 52062 Aachen > Tel. +49 241.9291018 * ve...@gmx.de > > > Paul Richard Thomas <paul.richard.tho...@gmail.com> schrieb: > > Cancel that - It should be multiplies by kind, shouldn't it ? :-) OK, > string length it is. We will probably have to set _len = 1 for other > dynamic types, though, so that the pointer arising from an array > reference is base_address + _len*vptr->size*index > > Cheers > > Paul > > On 17 January 2015 at 13:44, Paul Richard Thomas > <paul.richard.tho...@gmail.com> wrote: >> Dear Andre, >> >> I am open to either - what do the others think? >> >> The reason why I am for differentiating between unlimited_polymorphic >> objects and the deferred length character arrays is because of the >> difference in the way in which arrays are accessed. The former uses >> pointer arithmetic and the latter array references. I was trying to >> avoid divisions by KIND within scalarization loops. Also, I found that >> in developing your patch, that allocating with unlimited polymorphic >> sources looks neatest when the _len contains the memory size of the >> elements of any dynamic type, since a priori it is not known at >> compile time whether it is a character or not. Of course, one could >> interrogate the _hash field of the vtable, at the expense of more >> runtime code. >> >> Cheers >> >> Paul >> >> PS I have your patches for PR60357 and 61275 regtesting right now. >> Both look OK to me. At the risk of making potential regressions more >> complicated to unravel, to save my time I intend to commit both at >> once, unless anybody objects. >> >> >> >> On 17 January 2015 at 13:10, Andre Vehreschild <ve...@gmx.de> wrote: >>> Hi Paul, >>> >>> I am open on what to call the new component. >>> >>> Have you thought about my findings, that for deferred length char arrays >>> the >>> length is stored in characters and not in bytes, I.e., for a >>> character(kind=4, Len=:) the length is stored in number of characters and >>> not in bytes needed, which would be Len*4. IMHO both concepts should be >>> changed, or none. I favor to keep storing the string length of both >>> concepts >>> (deferred char arrays and chararrays in unlimited polymorphic entities) >>> interchangeable w/o computation. >>> >>> What's your opinion? >>> >>> Regards, Andre >>> >>> Andre Vehreschild * Kreuzherrenstr. 8 * 52062 Aachen >>> Tel. +49 241.9291018 * ve...@gmx.de >>> >>> >>> Paul Richard Thomas <paul.richard.tho...@gmail.com> schrieb: >>> >>> >>> Dear Andre, >>> >>> Perhaps, rather than calling the new component _len, we should call it >>> _mem_size or some such? >>> >>> Cheers >>> >>> Paul >>> >>> On 9 January 2015 at 11:52, Andre Vehreschild <ve...@gmx.de> wrote: >>>> Hi all, hi Paul, >>>> >>>> I started to implement the changes requested below, but I stumbled over >>>> an >>>> oddity: >>>> >>>> For a deferred length kind4 char array, the length of the string is >>>> stored >>>> without multiplication by 4 in the length variable attached. So when we >>>> now >>>> decide to store the length of the string in an unlimited polymorphic >>>> entity in >>>> bytes in the component formerly called _len and the size of each >>>> character >>>> in >>>> _vtype->_size then we have an inconsistency with the style deferred char >>>> lengths are stored. IMHO we should store this consistently, i.e., both >>>> 'length'-variables store either the length of the string ('length' = >>>> array_len) >>>> or the size of the memory needed ('length' = array_len * char_size). >>>> What >>>> do >>>> you think? >>>> >>>> Furthermore, think about debugging: When looking at an unlimited >>>> polymorphic >>>> entity storing a kind-4-char-array of length 7, then having a 'length' >>>> component >>>> set to 28 will lead to confusion. I humbly predict, that this will >>>> produce >>>> many >>>> entries in the bugtracker, because people don't understand that 'length' >>>> stores >>>> the product of elem_size times string_len, because all they see is an >>>> assignment of a length-7 char array. >>>> >>>> What do we do about it? >>>> >>>> Regards, >>>> Andre >>>> >>>> On Thu, 8 Jan 2015 20:56:43 +0100 >>>> Paul Richard Thomas <paul.richard.tho...@gmail.com> wrote: >>>> >>>>> 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 >>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> 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 >> >> >> >> -- >> Outside of a dog, a book is a man's best friend. Inside of a dog it's >> too dark to read. >> >> Groucho Marx > > > > -- > Outside of a dog, a book is a man's best friend. Inside of a dog it's > too dark to read. > > Groucho Marx -- Outside of a dog, a book is a man's best friend. Inside of a dog it's too dark to read. Groucho Marx