From 689ffc5cc1d9ba2e70aae4d7c342288c155a2118 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 2 Apr 2015 12:43:31 +0000 Subject: [PATCH] Partially revert "Replace custom alignment enforcement with LLVM_ALIGNAS." MSVC 2013 can't even parse __declspec(align(sizeof(foo))). We'll have to wait until MSVC 2015 for this. This partially reverts commit r233911. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233912 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclGroup.h | 9 ++++++--- include/clang/AST/DeclTemplate.h | 27 ++++++++++++++++++++------- include/clang/AST/Stmt.h | 5 ++++- lib/AST/Decl.cpp | 6 ++++-- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/include/clang/AST/DeclGroup.h b/include/clang/AST/DeclGroup.h index 04718f4741..bd3dbd8fa7 100644 --- a/include/clang/AST/DeclGroup.h +++ b/include/clang/AST/DeclGroup.h @@ -14,7 +14,6 @@ #ifndef LLVM_CLANG_AST_DECLGROUP_H #define LLVM_CLANG_AST_DECLGROUP_H -#include "llvm/Support/Compiler.h" #include "llvm/Support/DataTypes.h" #include @@ -25,9 +24,13 @@ class Decl; class DeclGroup; class DeclGroupIterator; -class LLVM_ALIGNAS(sizeof(void *)) DeclGroup { +class DeclGroup { // FIXME: Include a TypeSpecifier object. - unsigned NumDecls; + union { + unsigned NumDecls; + + Decl *Aligner; + }; private: DeclGroup() : NumDecls(0) {} diff --git a/include/clang/AST/DeclTemplate.h b/include/clang/AST/DeclTemplate.h index 60e0481944..39b5208a66 100644 --- a/include/clang/AST/DeclTemplate.h +++ b/include/clang/AST/DeclTemplate.h @@ -460,12 +460,21 @@ public: /// friend void foo<>(T); /// }; /// \endcode -class LLVM_ALIGNAS(sizeof(void *)) DependentFunctionTemplateSpecializationInfo { - /// The number of potential template candidates. - unsigned NumTemplates; +class DependentFunctionTemplateSpecializationInfo { + struct CA { + /// The number of potential template candidates. + unsigned NumTemplates; - /// The number of template arguments. - unsigned NumArgs; + /// The number of template arguments. + unsigned NumArgs; + }; + + union { + // Force sizeof to be a multiple of sizeof(void*) so that the + // trailing data is aligned. + void *Aligner; + struct CA d; + }; /// The locations of the left and right angle brackets. SourceRange AngleLocs; @@ -481,7 +490,9 @@ public: /// \brief Returns the number of function templates that this might /// be a specialization of. - unsigned getNumTemplates() const { return NumTemplates; } + unsigned getNumTemplates() const { + return d.NumTemplates; + } /// \brief Returns the i'th template candidate. FunctionTemplateDecl *getTemplate(unsigned I) const { @@ -496,7 +507,9 @@ public: } /// \brief Returns the number of explicit template arguments that were given. - unsigned getNumTemplateArgs() const { return NumArgs; } + unsigned getNumTemplateArgs() const { + return d.NumArgs; + } /// \brief Returns the nth template argument. const TemplateArgumentLoc &getTemplateArg(unsigned I) const { diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index 6739cb3fb0..a55cba9d1a 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -101,7 +101,7 @@ namespace clang { /// Stmt - This represents one statement. /// -class LLVM_ALIGNAS(sizeof(void *)) Stmt { +class Stmt { public: enum StmtClass { NoStmtClass = 0, @@ -287,6 +287,9 @@ protected: }; union { + // FIXME: this is wasteful on 64-bit platforms. + void *Aligner; + StmtBitfields StmtBits; CompoundStmtBitfields CompoundStmtBits; ExprBitfields ExprBits; diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index b4410538f7..3efd24f21f 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -3103,11 +3103,13 @@ FunctionDecl::setDependentTemplateSpecialization(ASTContext &Context, DependentFunctionTemplateSpecializationInfo:: DependentFunctionTemplateSpecializationInfo(const UnresolvedSetImpl &Ts, const TemplateArgumentListInfo &TArgs) - : NumTemplates(Ts.size()), NumArgs(TArgs.size()), - AngleLocs(TArgs.getLAngleLoc(), TArgs.getRAngleLoc()) { + : AngleLocs(TArgs.getLAngleLoc(), TArgs.getRAngleLoc()) { static_assert(sizeof(*this) % llvm::AlignOf::Alignment == 0, "Trailing data is unaligned!"); + d.NumTemplates = Ts.size(); + d.NumArgs = TArgs.size(); + FunctionTemplateDecl **TsArray = const_cast(getTemplates()); for (unsigned I = 0, E = Ts.size(); I != E; ++I) -- 2.40.0