[PATCH] D49508: [Sema] Expr::skipRValueSubobjectAdjustments(): record skipped NoOp casts.

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 19 12:28:30 PDT 2018


lebedev.ri added a comment.

In https://reviews.llvm.org/D49508#1168620, @rjmccall wrote:

> In https://reviews.llvm.org/D49508#1168599, @lebedev.ri wrote:
>
> > In https://reviews.llvm.org/D49508#1168584, @rjmccall wrote:
> >
> > > Hmm.  I think the approach of flagging ICEs that are semantically part of an explicit cast is probably a better representation for tools across the board.
> >
> >
> > I could do that, but i couldn't find where it should be done.
> >  Where are these "ICEs that are semantically part of an explicit cast" created?
>
>
> The design of `CastExpr` is that each node does exactly one implicit conversion step, but sometimes a conversion involves performing multiple steps which each has to get its own node, so all those initial conversions have to be represented as ICEs.  Also, while we do make some effort to give the explicit cast node a meaningful `CastKind`, in some situations it's just easier to build an ICE with the real CK and then just make the explicit cast a `NoOp`.  All those ICEs are triggered by the checking of the explicit cast and therefore semantically part of that operation even if they're separate nodes for technical reasons.
>
> > Where would we mark them?
>
> Well, explicit casts are handled by SemaCast.cpp, and all the checking routines are managed by a `CastOperation` helper class.  In fact, it's set up so that you could very easily (1) stash the original expression in the `CastOperation` construct and then (2) in `complete()`, just walk from the given cast up to the original expression and mark every ICE you see as being part of the explicit cast.


Hmm, thank you for these pointers. I agree that it would be *nicer*. Let's see..

>>> If we *are* going to do it this way, though, I think you should (1) make the collection of skipped expressions optional and (2) collect *all* the skipped expressions, not just no-op casts.
>> 
>> 1. I was wondering about that, will do.
>> 2. Well, i could do that, but i would need to filter them afterwards in my use-case.
> 
> Well, you're filtering them anyway, right?  You're scanning the list for explicit casts.

I meant filter the list to only contain skipped casts, before actually scanning it for specific conditions.

>>   So i wonder - what is the motivation for that?
>>   Nothing else needs that additional knowledge right now.
> 
> It has a much more obvious specification and it's not hard to imagine clients that would want to scan that list for other things.  (In fact, the comma-expressions list could pretty easily be combined into that.)




Repository:
  rC Clang

https://reviews.llvm.org/D49508





More information about the llvm-commits mailing list