forked from OSchip/llvm-project
[TrailingObjects] Convert CastExpr and subclasses.
llvm-svn: 256608
This commit is contained in:
parent
54894fdcc4
commit
1d75c5eccf
|
@ -2678,8 +2678,6 @@ public:
|
|||
path_const_iterator path_begin() const { return path_buffer(); }
|
||||
path_const_iterator path_end() const { return path_buffer() + path_size(); }
|
||||
|
||||
void setCastPath(const CXXCastPath &Path);
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() >= firstCastExprConstant &&
|
||||
T->getStmtClass() <= lastCastExprConstant;
|
||||
|
@ -2709,7 +2707,9 @@ public:
|
|||
/// // to an xvalue of type Base
|
||||
/// }
|
||||
/// @endcode
|
||||
class ImplicitCastExpr : public CastExpr {
|
||||
class ImplicitCastExpr final
|
||||
: public CastExpr,
|
||||
private llvm::TrailingObjects<ImplicitCastExpr, CXXBaseSpecifier *> {
|
||||
private:
|
||||
ImplicitCastExpr(QualType ty, CastKind kind, Expr *op,
|
||||
unsigned BasePathLength, ExprValueKind VK)
|
||||
|
@ -2745,6 +2745,9 @@ public:
|
|||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == ImplicitCastExprClass;
|
||||
}
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class CastExpr;
|
||||
};
|
||||
|
||||
inline Expr *Expr::IgnoreImpCasts() {
|
||||
|
@ -2804,7 +2807,9 @@ public:
|
|||
/// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style
|
||||
/// cast in C++ (C++ [expr.cast]), which uses the syntax
|
||||
/// (Type)expr. For example: @c (int)f.
|
||||
class CStyleCastExpr : public ExplicitCastExpr {
|
||||
class CStyleCastExpr final
|
||||
: public ExplicitCastExpr,
|
||||
private llvm::TrailingObjects<CStyleCastExpr, CXXBaseSpecifier *> {
|
||||
SourceLocation LPLoc; // the location of the left paren
|
||||
SourceLocation RPLoc; // the location of the right paren
|
||||
|
||||
|
@ -2842,6 +2847,9 @@ public:
|
|||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CStyleCastExprClass;
|
||||
}
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class CastExpr;
|
||||
};
|
||||
|
||||
/// \brief A builtin binary operation expression such as "x + y" or "x <= y".
|
||||
|
|
|
@ -235,7 +235,9 @@ public:
|
|||
///
|
||||
/// This expression node represents a C++ static cast, e.g.,
|
||||
/// \c static_cast<int>(1.0).
|
||||
class CXXStaticCastExpr : public CXXNamedCastExpr {
|
||||
class CXXStaticCastExpr final
|
||||
: public CXXNamedCastExpr,
|
||||
private llvm::TrailingObjects<CXXStaticCastExpr, CXXBaseSpecifier *> {
|
||||
CXXStaticCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op,
|
||||
unsigned pathSize, TypeSourceInfo *writtenTy,
|
||||
SourceLocation l, SourceLocation RParenLoc,
|
||||
|
@ -259,6 +261,9 @@ public:
|
|||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CXXStaticCastExprClass;
|
||||
}
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class CastExpr;
|
||||
};
|
||||
|
||||
/// \brief A C++ @c dynamic_cast expression (C++ [expr.dynamic.cast]).
|
||||
|
@ -266,7 +271,9 @@ public:
|
|||
/// This expression node represents a dynamic cast, e.g.,
|
||||
/// \c dynamic_cast<Derived*>(BasePtr). Such a cast may perform a run-time
|
||||
/// check to determine how to perform the type conversion.
|
||||
class CXXDynamicCastExpr : public CXXNamedCastExpr {
|
||||
class CXXDynamicCastExpr final
|
||||
: public CXXNamedCastExpr,
|
||||
private llvm::TrailingObjects<CXXDynamicCastExpr, CXXBaseSpecifier *> {
|
||||
CXXDynamicCastExpr(QualType ty, ExprValueKind VK, CastKind kind,
|
||||
Expr *op, unsigned pathSize, TypeSourceInfo *writtenTy,
|
||||
SourceLocation l, SourceLocation RParenLoc,
|
||||
|
@ -293,6 +300,9 @@ public:
|
|||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CXXDynamicCastExprClass;
|
||||
}
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class CastExpr;
|
||||
};
|
||||
|
||||
/// \brief A C++ @c reinterpret_cast expression (C++ [expr.reinterpret.cast]).
|
||||
|
@ -303,7 +313,10 @@ public:
|
|||
/// A reinterpret_cast provides a differently-typed view of a value but
|
||||
/// (in Clang, as in most C++ implementations) performs no actual work at
|
||||
/// run time.
|
||||
class CXXReinterpretCastExpr : public CXXNamedCastExpr {
|
||||
class CXXReinterpretCastExpr final
|
||||
: public CXXNamedCastExpr,
|
||||
private llvm::TrailingObjects<CXXReinterpretCastExpr,
|
||||
CXXBaseSpecifier *> {
|
||||
CXXReinterpretCastExpr(QualType ty, ExprValueKind vk, CastKind kind,
|
||||
Expr *op, unsigned pathSize,
|
||||
TypeSourceInfo *writtenTy, SourceLocation l,
|
||||
|
@ -328,6 +341,9 @@ public:
|
|||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CXXReinterpretCastExprClass;
|
||||
}
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class CastExpr;
|
||||
};
|
||||
|
||||
/// \brief A C++ \c const_cast expression (C++ [expr.const.cast]).
|
||||
|
@ -337,7 +353,9 @@ public:
|
|||
///
|
||||
/// A const_cast can remove type qualifiers but does not change the underlying
|
||||
/// value.
|
||||
class CXXConstCastExpr : public CXXNamedCastExpr {
|
||||
class CXXConstCastExpr final
|
||||
: public CXXNamedCastExpr,
|
||||
private llvm::TrailingObjects<CXXConstCastExpr, CXXBaseSpecifier *> {
|
||||
CXXConstCastExpr(QualType ty, ExprValueKind VK, Expr *op,
|
||||
TypeSourceInfo *writtenTy, SourceLocation l,
|
||||
SourceLocation RParenLoc, SourceRange AngleBrackets)
|
||||
|
@ -358,6 +376,9 @@ public:
|
|||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CXXConstCastExprClass;
|
||||
}
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class CastExpr;
|
||||
};
|
||||
|
||||
/// \brief A call to a literal operator (C++11 [over.literal])
|
||||
|
@ -1313,7 +1334,9 @@ public:
|
|||
/// \code
|
||||
/// x = int(0.5);
|
||||
/// \endcode
|
||||
class CXXFunctionalCastExpr : public ExplicitCastExpr {
|
||||
class CXXFunctionalCastExpr final
|
||||
: public ExplicitCastExpr,
|
||||
private llvm::TrailingObjects<CXXFunctionalCastExpr, CXXBaseSpecifier *> {
|
||||
SourceLocation LParenLoc;
|
||||
SourceLocation RParenLoc;
|
||||
|
||||
|
@ -1350,6 +1373,9 @@ public:
|
|||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CXXFunctionalCastExprClass;
|
||||
}
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class CastExpr;
|
||||
};
|
||||
|
||||
/// @brief Represents a C++ functional cast expression that builds a
|
||||
|
|
|
@ -1521,11 +1521,15 @@ public:
|
|||
/// \code
|
||||
/// NSString *str = (__bridge_transfer NSString *)CFCreateString();
|
||||
/// \endcode
|
||||
class ObjCBridgedCastExpr : public ExplicitCastExpr {
|
||||
class ObjCBridgedCastExpr final
|
||||
: public ExplicitCastExpr,
|
||||
private llvm::TrailingObjects<ObjCBridgedCastExpr, CXXBaseSpecifier *> {
|
||||
SourceLocation LParenLoc;
|
||||
SourceLocation BridgeKeywordLoc;
|
||||
unsigned Kind : 2;
|
||||
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class CastExpr;
|
||||
friend class ASTStmtReader;
|
||||
friend class ASTStmtWriter;
|
||||
|
||||
|
|
|
@ -1743,9 +1743,9 @@ Expr *CastExpr::getSubExprAsWritten() {
|
|||
CXXBaseSpecifier **CastExpr::path_buffer() {
|
||||
switch (getStmtClass()) {
|
||||
#define ABSTRACT_STMT(x)
|
||||
#define CASTEXPR(Type, Base) \
|
||||
case Stmt::Type##Class: \
|
||||
return reinterpret_cast<CXXBaseSpecifier**>(static_cast<Type*>(this)+1);
|
||||
#define CASTEXPR(Type, Base) \
|
||||
case Stmt::Type##Class: \
|
||||
return static_cast<Type *>(this)->getTrailingObjects<CXXBaseSpecifier *>();
|
||||
#define STMT(Type, Base)
|
||||
#include "clang/AST/StmtNodes.inc"
|
||||
default:
|
||||
|
@ -1753,28 +1753,23 @@ CXXBaseSpecifier **CastExpr::path_buffer() {
|
|||
}
|
||||
}
|
||||
|
||||
void CastExpr::setCastPath(const CXXCastPath &Path) {
|
||||
assert(Path.size() == path_size());
|
||||
memcpy(path_buffer(), Path.data(), Path.size() * sizeof(CXXBaseSpecifier*));
|
||||
}
|
||||
|
||||
ImplicitCastExpr *ImplicitCastExpr::Create(const ASTContext &C, QualType T,
|
||||
CastKind Kind, Expr *Operand,
|
||||
const CXXCastPath *BasePath,
|
||||
ExprValueKind VK) {
|
||||
unsigned PathSize = (BasePath ? BasePath->size() : 0);
|
||||
void *Buffer =
|
||||
C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
ImplicitCastExpr *E =
|
||||
new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK);
|
||||
if (PathSize) E->setCastPath(*BasePath);
|
||||
if (PathSize)
|
||||
std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
|
||||
E->getTrailingObjects<CXXBaseSpecifier *>());
|
||||
return E;
|
||||
}
|
||||
|
||||
ImplicitCastExpr *ImplicitCastExpr::CreateEmpty(const ASTContext &C,
|
||||
unsigned PathSize) {
|
||||
void *Buffer =
|
||||
C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize);
|
||||
}
|
||||
|
||||
|
@ -1785,18 +1780,18 @@ CStyleCastExpr *CStyleCastExpr::Create(const ASTContext &C, QualType T,
|
|||
TypeSourceInfo *WrittenTy,
|
||||
SourceLocation L, SourceLocation R) {
|
||||
unsigned PathSize = (BasePath ? BasePath->size() : 0);
|
||||
void *Buffer =
|
||||
C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
CStyleCastExpr *E =
|
||||
new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R);
|
||||
if (PathSize) E->setCastPath(*BasePath);
|
||||
if (PathSize)
|
||||
std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
|
||||
E->getTrailingObjects<CXXBaseSpecifier *>());
|
||||
return E;
|
||||
}
|
||||
|
||||
CStyleCastExpr *CStyleCastExpr::CreateEmpty(const ASTContext &C,
|
||||
unsigned PathSize) {
|
||||
void *Buffer =
|
||||
C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize);
|
||||
}
|
||||
|
||||
|
|
|
@ -589,19 +589,19 @@ CXXStaticCastExpr *CXXStaticCastExpr::Create(const ASTContext &C, QualType T,
|
|||
SourceLocation RParenLoc,
|
||||
SourceRange AngleBrackets) {
|
||||
unsigned PathSize = (BasePath ? BasePath->size() : 0);
|
||||
void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
|
||||
+ PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
CXXStaticCastExpr *E =
|
||||
new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
|
||||
RParenLoc, AngleBrackets);
|
||||
if (PathSize) E->setCastPath(*BasePath);
|
||||
if (PathSize)
|
||||
std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
|
||||
E->getTrailingObjects<CXXBaseSpecifier *>());
|
||||
return E;
|
||||
}
|
||||
|
||||
CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(const ASTContext &C,
|
||||
unsigned PathSize) {
|
||||
void *Buffer =
|
||||
C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
|
||||
}
|
||||
|
||||
|
@ -614,19 +614,19 @@ CXXDynamicCastExpr *CXXDynamicCastExpr::Create(const ASTContext &C, QualType T,
|
|||
SourceLocation RParenLoc,
|
||||
SourceRange AngleBrackets) {
|
||||
unsigned PathSize = (BasePath ? BasePath->size() : 0);
|
||||
void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
|
||||
+ PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
CXXDynamicCastExpr *E =
|
||||
new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
|
||||
RParenLoc, AngleBrackets);
|
||||
if (PathSize) E->setCastPath(*BasePath);
|
||||
if (PathSize)
|
||||
std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
|
||||
E->getTrailingObjects<CXXBaseSpecifier *>());
|
||||
return E;
|
||||
}
|
||||
|
||||
CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(const ASTContext &C,
|
||||
unsigned PathSize) {
|
||||
void *Buffer =
|
||||
C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
|
||||
}
|
||||
|
||||
|
@ -671,19 +671,19 @@ CXXReinterpretCastExpr::Create(const ASTContext &C, QualType T,
|
|||
SourceLocation RParenLoc,
|
||||
SourceRange AngleBrackets) {
|
||||
unsigned PathSize = (BasePath ? BasePath->size() : 0);
|
||||
void *Buffer =
|
||||
C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
CXXReinterpretCastExpr *E =
|
||||
new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
|
||||
RParenLoc, AngleBrackets);
|
||||
if (PathSize) E->setCastPath(*BasePath);
|
||||
if (PathSize)
|
||||
std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
|
||||
E->getTrailingObjects<CXXBaseSpecifier *>());
|
||||
return E;
|
||||
}
|
||||
|
||||
CXXReinterpretCastExpr *
|
||||
CXXReinterpretCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) {
|
||||
void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
|
||||
+ PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
|
||||
}
|
||||
|
||||
|
@ -706,18 +706,18 @@ CXXFunctionalCastExpr::Create(const ASTContext &C, QualType T, ExprValueKind VK,
|
|||
const CXXCastPath *BasePath,
|
||||
SourceLocation L, SourceLocation R) {
|
||||
unsigned PathSize = (BasePath ? BasePath->size() : 0);
|
||||
void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
|
||||
+ PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
CXXFunctionalCastExpr *E =
|
||||
new (Buffer) CXXFunctionalCastExpr(T, VK, Written, K, Op, PathSize, L, R);
|
||||
if (PathSize) E->setCastPath(*BasePath);
|
||||
if (PathSize)
|
||||
std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
|
||||
E->getTrailingObjects<CXXBaseSpecifier *>());
|
||||
return E;
|
||||
}
|
||||
|
||||
CXXFunctionalCastExpr *
|
||||
CXXFunctionalCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) {
|
||||
void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
|
||||
+ PathSize * sizeof(CXXBaseSpecifier*));
|
||||
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
|
||||
return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue