On Thu, Nov 30, 2017 at 12:16 PM, David Malcolm <dmalc...@redhat.com> wrote:
> On Thu, 2017-11-16 at 10:58 +0100, Richard Biener wrote:
>> On Wed, Nov 15, 2017 at 4:33 PM, David Malcolm <dmalc...@redhat.com>
>> wrote:
>> > On Wed, 2017-11-15 at 12:11 +0100, Richard Biener wrote:
>> > > On Wed, Nov 15, 2017 at 7:17 AM, Trevor Saunders <tbsaunde@tbsaun
>> > > de.o
>> > > rg> wrote:
>> > > > On Fri, Nov 10, 2017 at 04:45:17PM -0500, David Malcolm wrote:
>> > > > > This patch provides a mechanism in tree.c for adding a
>> > > > > wrapper
>> > > > > node
>> > > > > for expressing a location_t, for those nodes for which
>> > > > > !CAN_HAVE_LOCATION_P, along with a new method of cp_expr.
>> > > > >
>> > > > > It's called in later patches in the kit via that new method.
>> > > > >
>> > > > > In this version of the patch, I use NON_LVALUE_EXPR for
>> > > > > wrapping
>> > > > > constants, and VIEW_CONVERT_EXPR for other nodes.
>> > > > >
>> > > > > I also turned off wrapper nodes for EXCEPTIONAL_CLASS_P, for
>> > > > > the
>> > > > > sake
>> > > > > of keeping the patch kit more minimal.
>> > > > >
>> > > > > The patch also adds a STRIP_ANY_LOCATION_WRAPPER macro for
>> > > > > stripping
>> > > > > such nodes, used later on in the patch kit.
>> > > >
>> > > > I happened to start reading this series near the end and was
>> > > > rather
>> > > > confused by this macro since it changes variables in a rather
>> > > > unhygienic
>> > > > way.  Did you consider just defining a inline function to
>> > > > return
>> > > > the
>> > > > actual decl?  It seems like its not used that often so the
>> > > > slight
>> > > > extra
>> > > > syntax should be that big a deal compared to the explicitness.
>> > >
>> > > Existing practice .... (STRIP_NOPS & friends).  I'm fine either
>> > > way, the patch looks good.

Note that STRIP_NOPS is now implemented in terms of such an inline
function, it would make sense to do the same here.

>> > > Eventually you can simplify things by doing less checking in
>> > > location_wrapper_p, like only checking
>> > >
>> > > +inline bool location_wrapper_p (const_tree exp)
>> > > +{
>> > > +  if ((TREE_CODE (exp) == NON_LVALUE_EXPR
>> > > +       || (TREE_CODE (exp) == VIEW_CONVERT_EXPR
>> > > +          && (TREE_TYPE (exp)
>> > > +                 == TREE_TYPE (TREE_OPERAND (exp, 0)))
>> > > +    return true;
>> > > +  return false;
>> > > +}
>> > >
>> > > and renaming to maybe_location_wrapper_p.  After all you can't
>> > > really
>> > > distinguish location wrappers from non-location wrappers?  (and
>> > > why
>> > > would you want to?)
>> >
>> > That's the implementation I originally tried.
>> >
>> > As noted in an earlier thread about this, the problem I ran into
>> > was
>> > (in g++.dg/conversion/reinterpret1.C):
>> >
>> >   // PR c++/15076
>> >
>> >   struct Y { Y(int &); };
>> >
>> >   int v;
>> >   Y y1(reinterpret_cast<int>(v));  // { dg-error "" }
>> >
>> > where the "reinterpret_cast<int>" has the same type as the VAR_DECL
>> > v,
>> > and hence the argument to y1 is a NON_LVALUE_EXPR around a
>> > VAR_DECL,
>> > where both have the same type, and hence location_wrapper_p () on
>> > the
>> > cast would return true.
>> >
>> > Compare with:
>> >
>> >   Y y1(v);
>> >
>> > where the argument "v" with a location wrapper is a
>> > VIEW_CONVERT_EXPR
>> > around a VAR_DECL.
>> >
>> > With the simpler conditions you suggested above, both are treated
>> > as
>> > location wrappers (leading to the dg-error in the test failing),
>> > whereas with the condition in the patch, only the latter is treated
>> > as
>> > a location wrapper, and an error is correctly emitted for the dg-
>> > error.
>> >
>> > Hope this sounds sane.  Maybe the function needs a more detailed
>> > comment explaining this?
>>
>> Yes.  I guess the above would argue for a new tree code but I can
>> see that it is better to avoid that.

Basically, we can only strip a NON_LVALUE_EXPR if the argument is
already not an lvalue.  We shouldn't need any extra check on
VIEW_CONVERT_EXPR.

> [...]
>
> Here's an updated version of the patch which:
> * adds a much more detailed comment to location_wrapper_p,
> * fixes an erroneous reference to LOCATION_WRAPPER_EXPR in the
>   comment to maybe_wrap_with_location (from an earlier unfinished
>   experiment)
> * adds a selftest for handling wrapper nodes.
>
> Is there consensus about whether this approach is sane? i.e.
> * adding wrapper nodes via re-using existing tree codes (this kit), vs
> * adding them via some new tree code ("LOCATION_WRAPPER_EXPR"?), vs
> * the workaround of:
>   "[PATCH] C++: use an optional vec<location_t> for callsites"
>     https://gcc.gnu.org/ml/gcc-patches/2017-08/msg01392.html
>
> Jason? Jakub? others?

I still like this approach.

Jason

Reply via email to