[Sema] Mark implicitly-inserted ICE's as being part of explicit cast (PR38166)

Authored by lebedev.ri on Jul 24 2018, 1:16 AM.


[Sema] Mark implicitly-inserted ICE's as being part of explicit cast (PR38166)

As discussed in PR38166, we need to be able to distinqush whether the cast
we are visiting is actually a cast, or part of an ExplicitCast.
There are at least four ways to get there:

  1. Introduce a new CastKind, and use it instead of IntegralCast if we are in ExplicitCast.

    Would work, but does not scale - what if we will need more of these cast kinds?
  2. Introduce a flag in CastExprBits, whether this cast is part of ExplicitCast or not.

    Would work, but it isn't immediately clear where it needs to be set.
  3. Fix ScalarExprEmitter::VisitCastExpr() to visit these NoOp casts.

    As pointed out by @rsmith, CodeGenFunction::EmitMaterializeTemporaryExpr calls

    skipRValueSubobjectAdjustments, which steps over the CK_NoOp cast`,

    which explains why we currently don't visit those.

    This is probably impossible, as @efriedma points out, that is intentional as per [class.temporary] in the standard
  4. And the simplest one, just record which NoOp casts we skip.

    It just kinda works as-is afterwards.

But, the approach with a flag is the least intrusive one, and is probably the best one overall.

Reviewers: rsmith, rjmccall, majnemer, efriedma

Reviewed By: rsmith

Subscribers: cfe-commits, aaron.ballman, vsk, llvm-commits, rsmith

Differential Revision: https://reviews.llvm.org/D49508

llvm-svn: 337815