On Thu, Nov 20, 2014 at 12:05 AM, Andrew MacLeod <amacl...@redhat.com> wrote:
> On 11/19/2014 05:24 PM, David Malcolm wrote:
>>
>> On Wed, 2014-11-19 at 22:36 +0100, Richard Biener wrote:
>>>
>>> On November 19, 2014 10:09:56 PM CET, Andrew MacLeod
>>> <amacl...@redhat.com> wrote:
>>>>
>>>> On 11/19/2014 03:43 PM, Richard Biener wrote:
>>>>>
>>>>> On November 19, 2014 8:26:23 PM CET, Andrew MacLeod
>>>>
>>>> <amacl...@redhat.com> wrote:
>>>>>>
>>>>>> On 11/19/2014 01:12 PM, David Malcolm wrote:
>>>>>>
>>>>>>> (A) could become:
>>>>>>>
>>>>>>>      greturn *stmt = gsi->as_a_greturn ();
>>>>>>>
>>>>>>> (B) could become:
>>>>>>>
>>>>>>>      stmt = gsi->dyn_cast <gcall *> ();
>>>>>>>      if (!stmt)
>>>>>>> or:
>>>>>>>
>>>>>>>      stmt = gsi->dyn_cast_gcall ();
>>>>>>>      if (!stmt)
>>>>>>>
>>>>>>> or maybe:
>>>>>>>
>>>>>>>      stmt = gsi->is_a_gcall ();
>>>>>>>      if (!stmt)
>>>>>>>
>>>>>>> An earlier version of my patches had casting methods within the
>>>>>>> gimple_statement_base class, which were rejected; the above
>>>>
>>>> proposals
>>>>>>>
>>>>>>> would instead put them within gimple_stmt_iterator.
>>>>>>>
>>>>>> I would like all gsi routines to be consistent, not a mix of
>>>>
>>>> functions
>>>>>>
>>>>>> and methods.
>>>>>> so something like
>>>>>>
>>>>>> stmt = gsi_as_call (gsi);
>>>>>> stmt = gsi_dyn_call (gsi);
>>>>>>
>>>>>> or we need to change gsi_stmt() and friends into methods and access
>>>>>> them
>>>>>> as gsi->stmt ()..  which is possibly better, but that much more
>>>>>> intrusive again (another 2000+ locations).
>>>>>> If we switched to methods everywhere for gsi, I'd prefer something
>>>>
>>>> like
>>>>>>
>>>>>> gsi->as_a_call ()
>>>>>> gsi->is_a_call ()
>>>>>> gsi->dyn_cast_call ()
>>>>>>
>>>>>> I think its more readable... and it removes a dependency on the
>>>>>> implementation.. so if we ever decide to change the name of 'gcall'
>>>>>> down
>>>>>> the road to using a namespace, and make it gimple::call or whatever,
>>>>
>>>> we
>>>>>>
>>>>>> wont have to change every single gsi-> location which has a
>>>>
>>>> templated
>>>>>>
>>>>>> use of the type.
>>>>>>
>>>>>> I'm also think this sort of thing could probably wait until next
>>>>
>>>> stage
>>>>>>
>>>>>> 1..
>>>>>>
>>>>>> my 2 cents...
>>>>>
>>>>> Why not as_a <gassign *> (*gsi)?  It would
>>>>> Add operator* to gsi of course.
>>>>>
>>>>> Richard.
>>>>>
>>>>>
>>>> I could live with that form too.
>>>>
>>>> we often have an instance of gimple_stmt_iterator rather than a pointer
>>>>
>>>> to it, so wouldn't  "operator gimple *()" to implicitly call gsi_stmt()
>>>>
>>>> when needed work better?     (or "operator gimple ()" before the next
>>>> change) ..
>>>
>>> Not sure.  The * matches how iterators work in STL...
>>>
>>> Note that for the cases where we pass a pointer to an iterator we can
>>> change those to use references to avoid writing **gsi.
>>>
>>> Richard.
>>>
>>>> Andrew
>>
>> I had a go at adding an operator * to gimple_stmt_iterator, using it
>> everywhere that we do an as_a<> or dyn_cast<> on the result of a
>> gsi_stmt, to abbreviate the gsi_stmt call down to one character.
>>
>> Patch attached; only lightly smoketested; am posting it for the sake of
>> discussion.
>>
>> I don't think this API will make the non-C++-fans happier; I think the
>> objection to the work I just merged is that it's adding more C++ than
>> those people are comfortable with.
>>
>> So although the attached patch makes things shorter (good), it's taking
>> things in a "more C++" direction (questionable).  I'd hoped to paper
>> over the C++ somewhat.
>>
>> I suspect that any API which requires the of < > characters within the
>> implementation of a gimple pass to mean a template is going to give
>> those less happy with C++ a visceral "ugh" reaction.  I wonder if
>> there's a way to spell these things that's concise and which doesn't
>> involve <> ?
>>
> wasnt that my last  thought?   is_a_call(), as_a_call() and dyn_cast_call ()
> ?
>
> I think lack of <> in identifiers helps us old brains parse faster :-)    <>
> are like ()... many many years of causing a certain kind of break in mental
> processing. I'm accustomed to single <> these days, but once you get into
> multiple <>'s I quickly loose track.  I find the same thing with ()... hence
> I'm not a lisp fan :-)

I think we want to have a consistent style across GCC even if seen as
ugly to some people.  Thus having (member) functions for conversion in
some cases
and as_a <> templates in others is bad.  C++ was supposed to make
grok GCC easier for newbies - this is exactly making it harder (not that
I believe in this story at all...)

> I dont think 'operator *' c++ifies it too much, but I still think operator
> gimple() would be easier...  no extra character at all, and no odd looking
> dereference of a non-pointer object or double dereference of a pointer.  I
> cant think of how that could get us into trouble... it'll always map to the
> stmt the iterator currently points to.

I dislike conversion operators.  Why is 'operator *' bad?  It's exactly
how iterators are supposed to work - after all the gsi stuff was modeled
after STL iterators!

So that's a definitive "no" from me to is_a_call () as_a_call () etc.

Richard.

> Andrew

Reply via email to