On Mon, Jul 16, 2018 at 11:48 AM Aldy Hernandez <al...@redhat.com> wrote:
>
>
>
> On 07/16/2018 04:19 AM, Richard Sandiford wrote:
> > Aldy Hernandez <al...@redhat.com> writes:
> >> On Thu, Jul 12, 2018 at 1:41 PM Jonathan Wakely <jwakely....@gmail.com> 
> >> wrote:
> >>>
> >>> On Thu, 12 Jul 2018 at 11:41, Richard Sandiford wrote:
> >>>> +Only use non-constant references in the following situations:
> >>>> +</p>
> >>>> +
> >>>> +<ul>
> >>>> +<li>when they are necessary to conform to a standard interface, such as
> >>>> +the first argument to a non-member <code>operator+=</code></li>
> >>>
> >>> And the return value of such operators (which also applies to member
> >>> operators, which is the more conventional way to write compound
> >>> assignment operators).
> >>>
> >>>> +<li>in a return value, when providing access to something that is known
> >>>> +to be nonnull</li>
> >>>> +</ul>
> >>>> +
> >>>> +<p>
> >>>> +In other situations the convention is to use pointers instead.
> >>>> +</p>
> >>>> +
> >>>> +<blockquote>
> >>>> +<pre><code>HOST_WIDE_INT do_arith (..., bool *overflow);   // OK
> >>>> +HOST_WIDE_INT do_arith (..., bool &amp;overflow);   // Please avoid
> >>>
> >>> I understand the objection to using references for out parameters (an
> >>> alternative to pointers is to return a struct with the wide int result
> >>> and the overflow flag), but ...
> >>
> >> Putting everything in a new struct is just going through more hoops to
> >> avoid a common language idiom that everyone in C++ is used to.
> >>
> >>>
> >>>> +int *elt = &amp;array[i];  // OK
> >>>> +int &amp;elt = array[i];   // Please avoid
> >>>
> >>> ... this seems unnecessary. If the function is so long that the fact
> >>> elt is a reference can easily get lost, the problem is the length of
> >>> the function, not the use of a reference.
> >>
> >> Agreed.
> >>
> >> Richard (Sandiford), this really looks like going out of your way to
> >> enforce a personal style issue across the entire code base.  It's sad
> >> that we try to come up with new ways to make it even harder for new
> >> developers to contribute to GCC.
> >
> > It's not enforcing a personal style issue so much as trying to stop
> > the source base from becoming even more inconsistent, admittedly in one
> > particular area only.
> >
> > Before the switch to C++, GCC was one of the most consistent source
> > bases I'd seen (more so even than LLVM IMO, having worked on both).
> > It's clearly less so now.  The problem isn't just legacy C-era code vs.
> > new C++ code, but different styles being used for the C++ code.
>
> I certainly appreciate your concern, and the time you have taken to
> amend the guidelines.  However, perhaps we should get consensus here, as
> this is an issue that affects us all.
>
> >
> > (It was interesting that Martin complained earlier in the thread about
> > how inconsistent GCC was.  I imagine that's the impression that new
> > developers would have now, rather than being glad that they can use
> > references to return things.)
> >
> > In the case of pointers vs. reference parameters for returning values,
> > we have a clear precendent from the C days and very few existing C++
> > functions that deviate from it.  So if we were going to pick one,
> > it seemed obvious which we should pick.  Perhaps there's an argument
> > that eventually everything will move over to the new style due to
> > natural churn, but I think another half-transition is far more likely.
>
> Heh.  I would definitely prefer moving to the new style ;-).
>
> >
> > But weight of opinion definitely seems to be against adding that rule
> > to the standards, so I'll drop the patch.
>
> Again, I have a preference for non constant references if it makes the
> code easier to read, but I don't feel so strongly as to fight about it,
> especially if there is consensus going the other way.
>
> I welcome more discussion on this, and will gladly accept what the
> majority agrees on.

The only thing I would insist on is consistency within a group of
API functions or even within related APIs (poly-int vs. wide-int for example).

Richard.

>
> Aldy

Reply via email to