summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/AST/Expr.h13
-rw-r--r--clang/include/clang/AST/Stmt.h3
-rw-r--r--clang/lib/AST/ASTDumper.cpp6
-rw-r--r--clang/lib/Sema/SemaCast.cpp4
-rw-r--r--clang/lib/Serialization/ASTReaderStmt.cpp2
-rw-r--r--clang/lib/Serialization/ASTWriterStmt.cpp2
6 files changed, 17 insertions, 13 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index ca5bd951600..7585231e62e 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/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/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h
index 9e70b218d3a..91dbcb71a60 100644
--- a/clang/include/clang/AST/Stmt.h
+++ b/clang/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/clang/lib/AST/ASTDumper.cpp b/clang/lib/AST/ASTDumper.cpp
index 6ccd913bd3e..f46ae58d192 100644
--- a/clang/lib/AST/ASTDumper.cpp
+++ b/clang/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/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp
index a669956422c..b7f4629fbab 100644
--- a/clang/lib/Sema/SemaCast.cpp
+++ b/clang/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<ImplicitCastExpr>(CE->getSubExpr())))
- CE->setIsPartOfExplicitCast(true);
+ for (; auto *ICE = dyn_cast<ImplicitCastExpr>(CE->getSubExpr()); CE = ICE)
+ ICE->setIsPartOfExplicitCast(true);
}
/// Complete an apparently-successful cast operation that yields
diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index ee03b6def02..d9d780b25b3 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/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/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index 79156dcc5ce..3efb6482dd4 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/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();
OpenPOWER on IntegriCloud