diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-03-06 20:45:54 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-03-06 20:45:54 +0000 |
commit | 79cd11620c6f05dbf7bb706744eba354574e8b54 (patch) | |
tree | 93242f415fc670e3861e9437498f026ab0739337 | |
parent | 9fa14a547881e7abbe1edcdb92e6d3084be8d8bc (diff) |
Handle #pragma pack(0). I left this out of diagnostic because users should
really use pack() instead.
- <rdar://problem/6650243> clang warns about '#pragma pack(0)'
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66287 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaAttr.cpp | 6 | ||||
-rw-r--r-- | test/Sema/pragma-pack-2.c | 27 |
2 files changed, 31 insertions, 2 deletions
diff --git a/lib/Sema/SemaAttr.cpp b/lib/Sema/SemaAttr.cpp index bf1e10e5b0..37962ad173 100644 --- a/lib/Sema/SemaAttr.cpp +++ b/lib/Sema/SemaAttr.cpp @@ -102,8 +102,11 @@ void Sema::ActOnPragmaPack(PragmaPackKind Kind, IdentifierInfo *Name, unsigned AlignmentVal = 0; if (Alignment) { llvm::APSInt Val; + + // pack(0) is like pack(), which just works out since that is what + // we use 0 for in PackAttr. if (!Alignment->isIntegerConstantExpr(Val, Context) || - !Val.isPowerOf2() || + !(Val == 0 || Val.isPowerOf2()) || Val.getZExtValue() > 16) { Diag(PragmaLoc, diag::warn_pragma_pack_invalid_alignment); Alignment->Destroy(Context); @@ -115,7 +118,6 @@ void Sema::ActOnPragmaPack(PragmaPackKind Kind, IdentifierInfo *Name, if (PackContext == 0) PackContext = new PragmaPackStack(); - PragmaPackStack *Context = static_cast<PragmaPackStack*>(PackContext); diff --git a/test/Sema/pragma-pack-2.c b/test/Sema/pragma-pack-2.c index e139be0be8..c86136bf3e 100644 --- a/test/Sema/pragma-pack-2.c +++ b/test/Sema/pragma-pack-2.c @@ -64,3 +64,30 @@ struct s2_4 { #pragma pack(pop) }; extern int a2_4[offsetof(struct s2_4, f1) == 4 ? 1 : -1]; + +#pragma pack(1) +struct s3_0 { + char f0; + int f1; +}; +#pragma pack() +struct s3_1 { + char f0; + int f1; +}; +extern int a3_0[offsetof(struct s3_0, f1) == 1 ? 1 : -1]; +extern int a3_1[offsetof(struct s3_1, f1) == 4 ? 1 : -1]; + +// pack(0) is like pack() +#pragma pack(1) +struct s4_0 { + char f0; + int f1; +}; +#pragma pack(0) +struct s4_1 { + char f0; + int f1; +}; +extern int a4_0[offsetof(struct s4_0, f1) == 1 ? 1 : -1]; +extern int a4_1[offsetof(struct s4_1, f1) == 4 ? 1 : -1]; |