]> granicus.if.org Git - clang/commitdiff
[AST] Shrink the Stmt hierarchy with LLVM_PTR_SIZE for MSVC 2013
authorReid Kleckner <reid@kleckner.net>
Thu, 2 Apr 2015 18:02:39 +0000 (18:02 +0000)
committerReid Kleckner <reid@kleckner.net>
Thu, 2 Apr 2015 18:02:39 +0000 (18:02 +0000)
Follow-up to r233921 that removes the 'void *Aligner' Stmt union member
for MSVC 2013.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233932 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Stmt.h

index 9a0fa8a8dd6f7f506153290677f586b4656b31e0..445cd849fcbc8eb9766ff90ddd427ff67e60c908 100644 (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) { }