Re: [PATCH] Make dwarf_expr_piece::pieces an std::vector

Pedro Alves
2017-09-14T09:21:11Z

On 09/14/2017 09:15 AM, Simon Marchi wrote:

> static struct piece_closure *
> allocate_piece_closure (struct dwarf2_per_cu_data *per_cu,
> - int n_pieces, struct dwarf_expr_piece *pieces,
> + const std::vector<dwarf_expr_piece> &&pieces,

const rval reference looks odd -- you can't really move
the internal elements out of a const vector. I think ...

> struct frame_info *frame)
> {
> - struct piece_closure *c = XCNEW (struct piece_closure);
> + struct piece_closure *c = new piece_closure;
> int i;
>
> c->refc = 1;
> c->per_cu = per_cu;
> - c->n_pieces = n_pieces;
> - c->pieces = XCNEWVEC (struct dwarf_expr_piece, n_pieces);
> + c->pieces = std::move (pieces);

... this isn't really moving, but actually copying, because
you'll end up calling 'std::vector(const std::vector &)', not
'std::vector(std::vector &&)'.

I wonder if there's ever a case for 'const T &&' parameters,
and if GCC could warn about them. At least in non-template
functions.

Thanks,
Pedro Alves