From: Roman Lebedev Date: Fri, 27 Jul 2018 07:27:14 +0000 (+0000) Subject: [AST] Sink 'part of explicit cast' down into ImplicitCastExpr X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a987ef0b0d883c8f33502e47b9b6f32e0546980;p=clang [AST] Sink 'part of explicit cast' down into ImplicitCastExpr 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'. Reviewers: rsmith, rjmccall, erichkeane, aaron.ballman Reviewed By: rsmith, erichkeane Subscribers: vsk, cfe-commits, rsmith Tags: #clang Differential Revision: https://reviews.llvm.org/D49838 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@338108 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index ca5bd95160..7585231e62 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -2830,6 +2830,7 @@ protected: /// Construct an empty cast. CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize) : Expr(SC, Empty) { + CastExprBits.PartOfExplicitCast = false; setBasePathSize(BasePathSize); } @@ -2837,13 +2838,6 @@ public: CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; } void setCastKind(CastKind K) { CastExprBits.Kind = K; } - bool getIsPartOfExplicitCast() const { - return CastExprBits.PartOfExplicitCast; - } - void setIsPartOfExplicitCast(bool PartOfExplicitCast) { - CastExprBits.PartOfExplicitCast = PartOfExplicitCast; - } - static const char *getCastKindName(CastKind CK); const char *getCastKindName() const { return getCastKindName(getCastKind()); } @@ -2932,6 +2926,11 @@ public: : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0) { } + bool isPartOfExplicitCast() const { return CastExprBits.PartOfExplicitCast; } + void setIsPartOfExplicitCast(bool PartOfExplicitCast) { + CastExprBits.PartOfExplicitCast = PartOfExplicitCast; + } + static ImplicitCastExpr *Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index 9e70b218d3..91dbcb71a6 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -198,11 +198,12 @@ protected: class CastExprBitfields { friend class CastExpr; + friend class ImplicitCastExpr; unsigned : NumExprBits; unsigned Kind : 6; - unsigned PartOfExplicitCast : 1; + unsigned PartOfExplicitCast : 1; // Only set for ImplicitCastExpr. unsigned BasePathSize : 32 - 6 - 1 - NumExprBits; }; diff --git a/lib/AST/ASTDumper.cpp b/lib/AST/ASTDumper.cpp index 6ccd913bd3..f46ae58d19 100644 --- a/lib/AST/ASTDumper.cpp +++ b/lib/AST/ASTDumper.cpp @@ -521,6 +521,7 @@ namespace { // Exprs void VisitExpr(const Expr *Node); void VisitCastExpr(const CastExpr *Node); + void VisitImplicitCastExpr(const ImplicitCastExpr *Node); void VisitDeclRefExpr(const DeclRefExpr *Node); void VisitPredefinedExpr(const PredefinedExpr *Node); void VisitCharacterLiteral(const CharacterLiteral *Node); @@ -2117,8 +2118,11 @@ void ASTDumper::VisitCastExpr(const CastExpr *Node) { } dumpBasePath(OS, Node); OS << ">"; +} - if (Node->getIsPartOfExplicitCast()) +void ASTDumper::VisitImplicitCastExpr(const ImplicitCastExpr *Node) { + VisitCastExpr(Node); + if (Node->isPartOfExplicitCast()) OS << " part_of_explicit_cast"; } diff --git a/lib/Sema/SemaCast.cpp b/lib/Sema/SemaCast.cpp index a669956422..b7f4629fba 100644 --- a/lib/Sema/SemaCast.cpp +++ b/lib/Sema/SemaCast.cpp @@ -93,8 +93,8 @@ namespace { // Walk down from the CE to the OrigSrcExpr, and mark all immediate // ImplicitCastExpr's as being part of ExplicitCastExpr. The original CE // (which is a ExplicitCastExpr), and the OrigSrcExpr are not touched. - while ((CE = dyn_cast(CE->getSubExpr()))) - CE->setIsPartOfExplicitCast(true); + for (; auto *ICE = dyn_cast(CE->getSubExpr()); CE = ICE) + ICE->setIsPartOfExplicitCast(true); } /// Complete an apparently-successful cast operation that yields diff --git a/lib/Serialization/ASTReaderStmt.cpp b/lib/Serialization/ASTReaderStmt.cpp index ee03b6def0..d9d780b25b 100644 --- a/lib/Serialization/ASTReaderStmt.cpp +++ b/lib/Serialization/ASTReaderStmt.cpp @@ -723,7 +723,6 @@ void ASTStmtReader::VisitCastExpr(CastExpr *E) { assert(NumBaseSpecs == E->path_size()); E->setSubExpr(Record.readSubExpr()); E->setCastKind((CastKind)Record.readInt()); - E->setIsPartOfExplicitCast(Record.readInt()); CastExpr::path_iterator BaseI = E->path_begin(); while (NumBaseSpecs--) { auto *BaseSpec = new (Record.getContext()) CXXBaseSpecifier; @@ -770,6 +769,7 @@ ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) { void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) { VisitCastExpr(E); + E->setIsPartOfExplicitCast(Record.readInt()); } void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) { diff --git a/lib/Serialization/ASTWriterStmt.cpp b/lib/Serialization/ASTWriterStmt.cpp index 79156dcc5c..3efb6482dd 100644 --- a/lib/Serialization/ASTWriterStmt.cpp +++ b/lib/Serialization/ASTWriterStmt.cpp @@ -665,7 +665,6 @@ void ASTStmtWriter::VisitCastExpr(CastExpr *E) { Record.push_back(E->path_size()); Record.AddStmt(E->getSubExpr()); Record.push_back(E->getCastKind()); // FIXME: stable encoding - Record.push_back(E->getIsPartOfExplicitCast()); for (CastExpr::path_iterator PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI) @@ -714,6 +713,7 @@ ASTStmtWriter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) { void ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) { VisitCastExpr(E); + Record.push_back(E->isPartOfExplicitCast()); if (E->path_size() == 0) AbbrevToUse = Writer.getExprImplicitCastAbbrev();