[AST] Shrink the Stmt hierarchy with LLVM_PTR_SIZE for MSVC 2013

Follow-up to r233921 that removes the 'void *Aligner' Stmt union member
for MSVC 2013.

llvm-svn: 233932
This commit is contained in:
Reid Kleckner 2015-04-02 18:02:39 +00:00
parent 2bb5d695f9
commit a5cad0d6a6
1 changed files with 11 additions and 14 deletions

View File

@ -101,13 +101,7 @@ namespace clang {
/// Stmt - This represents one statement.
///
#if !defined(_MSC_VER) || LLVM_MSC_PREREQ(1900)
class LLVM_ALIGNAS(sizeof(void *)) Stmt {
#else
// Old MSVC has issues to align this. Drop when we retire MSVC 2013. When GCC
// 4.7 is also gone this can be just alignof(void *).
class Stmt {
#endif
class LLVM_ALIGNAS(LLVM_PTR_SIZE) Stmt {
public:
enum StmtClass {
NoStmtClass = 0,
@ -293,11 +287,6 @@ protected:
};
union {
#if !(!defined(_MSC_VER) || LLVM_MSC_PREREQ(1900))
// FIXME: this is wasteful on 64-bit platforms.
void *Aligner;
#endif
StmtBitfields StmtBits;
CompoundStmtBitfields CompoundStmtBits;
ExprBitfields ExprBits;
@ -802,7 +791,11 @@ class LabelStmt : public Stmt {
public:
LabelStmt(SourceLocation IL, LabelDecl *D, Stmt *substmt)
: Stmt(LabelStmtClass), IdentLoc(IL), TheDecl(D), SubStmt(substmt) {}
: Stmt(LabelStmtClass), IdentLoc(IL), TheDecl(D), SubStmt(substmt) {
static_assert(sizeof(LabelStmt) ==
2 * sizeof(SourceLocation) + 2 * sizeof(void *),
"LabelStmt too big");
}
// \brief Build an empty label statement.
explicit LabelStmt(EmptyShell Empty) : Stmt(LabelStmtClass, Empty) { }
@ -1316,8 +1309,12 @@ public:
///
class BreakStmt : public Stmt {
SourceLocation BreakLoc;
public:
BreakStmt(SourceLocation BL) : Stmt(BreakStmtClass), BreakLoc(BL) {}
BreakStmt(SourceLocation BL) : Stmt(BreakStmtClass), BreakLoc(BL) {
static_assert(sizeof(BreakStmt) == 2 * sizeof(SourceLocation),
"BreakStmt too large");
}
/// \brief Build an empty break statement.
explicit BreakStmt(EmptyShell Empty) : Stmt(BreakStmtClass, Empty) { }