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.

llvm-svn: 233912
This commit is contained in:
Benjamin Kramer 2015-04-02 12:43:31 +00:00
parent 1d4ffd74c1
commit 3ebba5237e
4 changed files with 34 additions and 13 deletions

View File

@ -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 <cassert>
@ -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) {}

View File

@ -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 {

View File

@ -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;

View File

@ -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<void *>::Alignment == 0,
"Trailing data is unaligned!");
d.NumTemplates = Ts.size();
d.NumArgs = TArgs.size();
FunctionTemplateDecl **TsArray =
const_cast<FunctionTemplateDecl**>(getTemplates());
for (unsigned I = 0, E = Ts.size(); I != E; ++I)