On 12/4/20 3:39 AM, Richard Biener wrote:
On Thu, Dec 3, 2020 at 10:46 PM Jeff Law via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:



On 12/3/20 10:53 AM, Jason Merrill via Gcc-patches wrote:
It looks cleaner if we can use a vec* directly as a range for the C++11
range-based 'for' loop, without needing to indirect from it, and also works
with null pointers.

The change in cp_parser_late_parsing_default_args is an example of how this
can be used to simplify many loops over vec*.

I deliberately didn't format the new overloads for etags since they are
trivial, but am open to changing that.

Tested x86_64-pc-linux-gnu.  Is this OK for trunk now, or should I hold it for
stage 1?

gcc/ChangeLog:

       * vec.h (begin, end): Add overloads for vec*.
       * tree.c (build_constructor_from_vec): Remove *.

gcc/cp/ChangeLog:

       * decl2.c (clear_consteval_vfns): Remove *.
       * pt.c (do_auto_deduction): Remove *.
       * parser.c (cp_parser_late_parsing_default_args): Change loop
       to use range 'for'.
I'd go forward with it now, it's simple enough and simplifies the code
we end up writing...

Btw, I was disappointed about range-for seeing you cannot express
iterating from element 2 or reverse iterating.  This means when we
try to adopt range-for we'll keep a messy mix of iteration style since
range-for cannot express all (or even most) iterations in our code base.

In C++20, for other ranges you use a range adaptor; to start from element 2 you'd use https://en.cppreference.com/w/cpp/ranges/drop_view

We could add similar adaptors to GCC to use them with range-for in C++11 code, possibly drawing on the range-v3 library (which doesn't require concepts support).

Jason

Reply via email to