This is an archive of the discontinued LLVM Phabricator instance.

[AST] Sink 'part of explicit cast' down into ImplicitCastExpr
ClosedPublic

Authored by lebedev.ri on Jul 26 2018, 1:35 AM.

Details

Summary

As discussed in IRC with @rsmith, it is slightly not good to keep that in the CastExpr itself:
Given the explicit cast, which is represented in AST as an ExplicitCastExpr + ImplicitCastExpr's,
only the ImplicitCastExpr's will be marked as PartOfExplicitCast, but not the ExplicitCastExpr itself.
Thus, it is only ever true for ImplicitCastExpr's, so we don't need to write/read/dump it for ExplicitCastExpr's.

We don't need to worry that we write the PartOfExplicitCast in PCH after CastExpr::path_iterator,
since the ExprImplicitCastAbbrev is only used when the NumBaseSpecs == 0, i.e. there is no 'path'.

Diff Detail

Repository
rC Clang

Event Timeline

lebedev.ri edited the summary of this revision. (Show Details)Jul 26 2018, 1:38 AM

2 small items, otherwise looks good.

include/clang/AST/Expr.h
2824

So, I'd prefer that this line get left in. Removing this makes it the single unused item in CastExprBitfields, so leaving it uninitialized is likely a bad idea.

lib/Sema/SemaCast.cpp
97

I think I'd prefer just using a different variable in the 'while' loop to avoid the cast. something like while((auto ICE =....

That said, either way this isn't a dyn_cast, this would be just a cast (since we KNOW the type).

2 small items, otherwise looks good.

Thank you for taking a look!

include/clang/AST/Expr.h
2824

Aha, ok.
That will result in less CastExprBits.PartOfExplicitCast = false; lines scattered across different constructors, too.

2832

Oh, i forget to init it here.

lib/Sema/SemaCast.cpp
97

I was trying to avoid having one extra variable, which may confuse things.
Let's see maybe it's not that ugly..

lebedev.ri marked 5 inline comments as done.

Address @erichkeane review notes.

lib/Sema/SemaCast.cpp
97

Indeed, cast<> should be used.
But trying to avoid this cast at all results in uglier code, so let's not.
(I need to call getSubExpr() on this new ImplicitCastExpr, so i'd need to maintain two variables, etc...)

erichkeane accepted this revision.Jul 26 2018, 7:39 AM
This revision is now accepted and ready to land.Jul 26 2018, 7:39 AM
rsmith added inline comments.Jul 26 2018, 1:21 PM
include/clang/AST/Expr.h
2937

Please also rename this to`isPartOfExplicitCast` as requested on IRC.

include/clang/AST/Stmt.h
206

representable for -> set for

lib/Sema/SemaCast.cpp
97

Maybe something like:

for (auto *Next = CE->getSubExpr(); auto *ICE = dyn_cast<ImplicitCastExpr>(Next); Next = ICE->getSubExpr())
  ICE->setIsPartOfExplicitCast(true);

or just

for (; auto *ICE = dyn_cast<ImplicitCastExpr>(CE->getSubExpr()); CE = ICE)
  ICE->setIsPartOfExplicitCast(true);
lebedev.ri marked 3 inline comments as done.

Address @rsmith review notes.

include/clang/AST/Expr.h
2937

Right, sorry.

lib/Sema/SemaCast.cpp
97

Oh wow, one can define variables not just in the "init-statement", how did i not notice this earlier?!
That changes the picture indeed.

rsmith accepted this revision.Jul 26 2018, 5:37 PM
This revision was automatically updated to reflect the committed changes.