Don't add attributes for "#pragma pack" and friends to tag declarations which

are not definitions. This follows the behavior of both gcc and earlier
versions of clang. Regression from r156531.  <rdar://problem/12048621>.

llvm-svn: 161523
This commit is contained in:
Eli Friedman 2012-08-08 21:08:34 +00:00
parent b1886eb604
commit 0415f3e138
3 changed files with 24 additions and 5 deletions

View File

@ -8807,9 +8807,10 @@ CreateNewDecl:
// many points during the parsing of a struct declaration (because
// the #pragma tokens are effectively skipped over during the
// parsing of the struct).
AddAlignmentAttributesForRecord(RD);
AddMsStructLayoutForRecord(RD);
if (TUK == TUK_Definition) {
AddAlignmentAttributesForRecord(RD);
AddMsStructLayoutForRecord(RD);
}
}
if (ModulePrivateLoc.isValid()) {

View File

@ -1064,8 +1064,10 @@ Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK,
// Add alignment attributes if necessary; these attributes are checked when
// the ASTContext lays out the structure.
AddAlignmentAttributesForRecord(NewClass);
AddMsStructLayoutForRecord(NewClass);
if (TUK == TUK_Definition) {
AddAlignmentAttributesForRecord(NewClass);
AddMsStructLayoutForRecord(NewClass);
}
ClassTemplateDecl *NewTemplate
= ClassTemplateDecl::Create(Context, SemanticContext, NameLoc,

View File

@ -0,0 +1,16 @@
// RUN: %clang_cc1 -triple i686-apple-darwin9 %s -fsyntax-only -verify
// Pragma pack handling with tag declarations
struct X;
#pragma pack(2)
struct X { int x; };
struct Y;
#pragma pack()
struct Y { int y; };
extern int check[__alignof(struct X) == 2 ? 1 : -1];
extern int check[__alignof(struct Y) == 4 ? 1 : -1];