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:
parent
b1886eb604
commit
0415f3e138
|
@ -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()) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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];
|
||||
|
Loading…
Reference in New Issue