r233932 - [AST] Shrink the Stmt hierarchy with LLVM_PTR_SIZE for MSVC 2013
Reid Kleckner
reid at kleckner.net
Thu Apr 2 11:02:39 PDT 2015
Author: rnk
Date: Thu Apr 2 13:02:39 2015
New Revision: 233932
URL: http://llvm.org/viewvc/llvm-project?rev=233932&view=rev
Log:
[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.
Modified:
cfe/trunk/include/clang/AST/Stmt.h
Modified: cfe/trunk/include/clang/AST/Stmt.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=233932&r1=233931&r2=233932&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Stmt.h (original)
+++ cfe/trunk/include/clang/AST/Stmt.h Thu Apr 2 13:02:39 2015
@@ -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) { }
More information about the cfe-commits
mailing list