<div dir="ltr">Thanks Duncan!</div><div class="gmail_extra"><br><div class="gmail_quote">On 15 April 2017 at 01:25, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">FYI, I reverted the modules side of this in r300380. For details, see the commit message. TL;DR: this didn't actually make modules builds closer to matching non-modules builds, thanks to how submodules work; on the contrary, it made them diverge.<br>
<div class="HOEnZb"><div class="h5"><br>
> On 2017-Mar-31, at 08:36, Alex Lorenz via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
><br>
> Author: arphaman<br>
> Date: Fri Mar 31 10:36:21 2017<br>
> New Revision: 299226<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=299226&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=299226&view=rev</a><br>
> Log:<br>
> [Modules][PCH] Serialize #pragma pack<br>
><br>
> This patch serializes the state of #pragma pack. It preserves the state of the<br>
> pragma from a PCH/from modules in a file that uses that PCH/those modules.<br>
><br>
<br>
> rdar://21359084<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D31241" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D31241</a><br>
><br>
> Added:<br>
> cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_push.h<br>
> cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_reset_push.h<br>
> cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_set.h<br>
> cfe/trunk/test/Modules/pragma-<wbr>pack.c<br>
> cfe/trunk/test/PCH/pragma-<wbr>pack.c<br>
> Modified:<br>
> cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h<br>
> cfe/trunk/include/clang/<wbr>Serialization/ASTReader.h<br>
> cfe/trunk/include/clang/<wbr>Serialization/ASTWriter.h<br>
> cfe/trunk/lib/Sema/SemaAttr.<wbr>cpp<br>
> cfe/trunk/lib/Serialization/<wbr>ASTReader.cpp<br>
> cfe/trunk/lib/Serialization/<wbr>ASTWriter.cpp<br>
> cfe/trunk/test/Modules/Inputs/<wbr>module.map<br>
><br>
> Modified: cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=299226&r1=299225&r2=299226&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Serialization/<wbr>ASTBitCodes.h?rev=299226&r1=<wbr>299225&r2=299226&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h (original)<br>
> +++ cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h Fri Mar 31 10:36:21 2017<br>
> @@ -604,6 +604,9 @@ namespace clang {<br>
> OPENCL_EXTENSION_DECLS = 59,<br>
><br>
> MODULAR_CODEGEN_DECLS = 60,<br>
> +<br>
> + /// \brief Record code for \#pragma pack options.<br>
> + PACK_PRAGMA_OPTIONS = 61,<br>
> };<br>
><br>
> /// \brief Record types used within a source manager block.<br>
><br>
> Modified: cfe/trunk/include/clang/<wbr>Serialization/ASTReader.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=299226&r1=299225&r2=299226&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Serialization/ASTReader.<wbr>h?rev=299226&r1=299225&r2=<wbr>299226&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/include/clang/<wbr>Serialization/ASTReader.h (original)<br>
> +++ cfe/trunk/include/clang/<wbr>Serialization/ASTReader.h Fri Mar 31 10:36:21 2017<br>
> @@ -811,6 +811,17 @@ private:<br>
> int PragmaMSPointersToMembersState = -1;<br>
> SourceLocation PointersToMembersPragmaLocatio<wbr>n;<br>
><br>
> + /// \brief The pragma pack state.<br>
> + Optional<unsigned> PragmaPackCurrentValue;<br>
> + SourceLocation PragmaPackCurrentLocation;<br>
> + struct PragmaPackStackEntry {<br>
> + unsigned Value;<br>
> + SourceLocation Location;<br>
> + StringRef SlotLabel;<br>
> + };<br>
> + llvm::SmallVector<<wbr>PragmaPackStackEntry, 2> PragmaPackStack;<br>
> + llvm::SmallVector<std::string, 2> PragmaPackStrings;<br>
> +<br>
> /// \brief The OpenCL extension settings.<br>
> OpenCLOptions OpenCLExtensions;<br>
><br>
><br>
> Modified: cfe/trunk/include/clang/<wbr>Serialization/ASTWriter.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=299226&r1=299225&r2=299226&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Serialization/ASTWriter.<wbr>h?rev=299226&r1=299225&r2=<wbr>299226&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/include/clang/<wbr>Serialization/ASTWriter.h (original)<br>
> +++ cfe/trunk/include/clang/<wbr>Serialization/ASTWriter.h Fri Mar 31 10:36:21 2017<br>
> @@ -485,6 +485,7 @@ private:<br>
> void WriteOptimizePragmaOptions(<wbr>Sema &SemaRef);<br>
> void WriteMSStructPragmaOptions(<wbr>Sema &SemaRef);<br>
> void WriteMSPointersToMembersPragma<wbr>Options(Sema &SemaRef);<br>
> + void WritePackPragmaOptions(Sema &SemaRef);<br>
> void WriteModuleFileExtension(Sema &SemaRef,<br>
> ModuleFileExtensionWriter &Writer);<br>
><br>
><br>
> Modified: cfe/trunk/lib/Sema/SemaAttr.<wbr>cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaAttr.cpp?rev=299226&r1=299225&r2=299226&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaAttr.cpp?rev=299226&r1=<wbr>299225&r2=299226&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/Sema/SemaAttr.<wbr>cpp (original)<br>
> +++ cfe/trunk/lib/Sema/SemaAttr.<wbr>cpp Fri Mar 31 10:36:21 2017<br>
> @@ -215,6 +215,7 @@ void Sema::PragmaStack<ValueType>::<wbr>Act(S<br>
> ValueType Value) {<br>
> if (Action == PSK_Reset) {<br>
> CurrentValue = DefaultValue;<br>
> + CurrentPragmaLocation = PragmaLocation;<br>
> return;<br>
> }<br>
> if (Action & PSK_Push)<br>
><br>
> Modified: cfe/trunk/lib/Serialization/<wbr>ASTReader.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=299226&r1=299225&r2=299226&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>Serialization/ASTReader.cpp?<wbr>rev=299226&r1=299225&r2=<wbr>299226&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/Serialization/<wbr>ASTReader.cpp (original)<br>
> +++ cfe/trunk/lib/Serialization/<wbr>ASTReader.cpp Fri Mar 31 10:36:21 2017<br>
> @@ -3298,6 +3298,28 @@ ASTReader::ReadASTBlock(<wbr>ModuleFile &F, u<br>
> }<br>
> ForceCUDAHostDeviceDepth = Record[0];<br>
> break;<br>
> +<br>
> + case PACK_PRAGMA_OPTIONS: {<br>
> + if (Record.size() < 3) {<br>
> + Error("invalid pragma pack record");<br>
> + return Failure;<br>
> + }<br>
> + PragmaPackCurrentValue = Record[0];<br>
> + PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]);<br>
> + unsigned NumStackEntries = Record[2];<br>
> + unsigned Idx = 3;<br>
> + // Reset the stack when importing a new module.<br>
> + PragmaPackStack.clear();<br>
> + for (unsigned I = 0; I < NumStackEntries; ++I) {<br>
> + PragmaPackStackEntry Entry;<br>
> + Entry.Value = Record[Idx++];<br>
> + Entry.Location = ReadSourceLocation(F, Record[Idx++]);<br>
> + PragmaPackStrings.push_back(<wbr>ReadString(Record, Idx));<br>
> + Entry.SlotLabel = PragmaPackStrings.back();<br>
> + PragmaPackStack.push_back(<wbr>Entry);<br>
> + }<br>
> + break;<br>
> + }<br>
> }<br>
> }<br>
> }<br>
> @@ -7419,6 +7441,34 @@ void ASTReader::UpdateSema() {<br>
> PointersToMembersPragmaLocatio<wbr>n);<br>
> }<br>
> SemaObj-><wbr>ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;<br>
> +<br>
> + if (PragmaPackCurrentValue) {<br>
> + // The bottom of the stack might have a default value. It must be adjusted<br>
> + // to the current value to ensure that the packing state is preserved after<br>
> + // popping entries that were included/imported from a PCH/module.<br>
> + bool DropFirst = false;<br>
> + if (!PragmaPackStack.empty() &&<br>
> + PragmaPackStack.front().<wbr>Location.isInvalid()) {<br>
> + assert(PragmaPackStack.front()<wbr>.Value == SemaObj->PackStack.<wbr>DefaultValue &&<br>
> + "Expected a default alignment value");<br>
> + SemaObj->PackStack.Stack.<wbr>emplace_back(<br>
> + PragmaPackStack.front().<wbr>SlotLabel, SemaObj->PackStack.<wbr>CurrentValue,<br>
> + SemaObj->PackStack.<wbr>CurrentPragmaLocation);<br>
> + DropFirst = true;<br>
> + }<br>
> + for (const auto &Entry :<br>
> + llvm::makeArrayRef(<wbr>PragmaPackStack).drop_front(<wbr>DropFirst ? 1 : 0))<br>
> + SemaObj->PackStack.Stack.<wbr>emplace_back(Entry.SlotLabel, Entry.Value,<br>
> + Entry.Location);<br>
> + if (PragmaPackCurrentLocation.<wbr>isInvalid()) {<br>
> + assert(*PragmaPackCurrentValue == SemaObj->PackStack.<wbr>DefaultValue &&<br>
> + "Expected a default alignment value");<br>
> + // Keep the current values.<br>
> + } else {<br>
> + SemaObj->PackStack.<wbr>CurrentValue = *PragmaPackCurrentValue;<br>
> + SemaObj->PackStack.<wbr>CurrentPragmaLocation = PragmaPackCurrentLocation;<br>
> + }<br>
> + }<br>
> }<br>
><br>
> IdentifierInfo *ASTReader::get(StringRef Name) {<br>
><br>
> Modified: cfe/trunk/lib/Serialization/<wbr>ASTWriter.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=299226&r1=299225&r2=299226&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>Serialization/ASTWriter.cpp?<wbr>rev=299226&r1=299225&r2=<wbr>299226&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/Serialization/<wbr>ASTWriter.cpp (original)<br>
> +++ cfe/trunk/lib/Serialization/<wbr>ASTWriter.cpp Fri Mar 31 10:36:21 2017<br>
> @@ -4170,6 +4170,20 @@ void ASTWriter::<wbr>WriteMSPointersToMembers<br>
> Stream.EmitRecord(POINTERS_TO_<wbr>MEMBERS_PRAGMA_OPTIONS, Record);<br>
> }<br>
><br>
> +/// \brief Write the state of 'pragma pack' at the end of the module.<br>
> +void ASTWriter::<wbr>WritePackPragmaOptions(Sema &SemaRef) {<br>
> + RecordData Record;<br>
> + Record.push_back(SemaRef.<wbr>PackStack.CurrentValue);<br>
> + AddSourceLocation(SemaRef.<wbr>PackStack.<wbr>CurrentPragmaLocation, Record);<br>
> + Record.push_back(SemaRef.<wbr>PackStack.Stack.size());<br>
> + for (const auto &StackEntry : SemaRef.PackStack.Stack) {<br>
> + Record.push_back(StackEntry.<wbr>Value);<br>
> + AddSourceLocation(StackEntry.<wbr>PragmaLocation, Record);<br>
> + AddString(StackEntry.<wbr>StackSlotLabel, Record);<br>
> + }<br>
> + Stream.EmitRecord(PACK_PRAGMA_<wbr>OPTIONS, Record);<br>
> +}<br>
> +<br>
> void ASTWriter::<wbr>WriteModuleFileExtension(Sema &SemaRef,<br>
> ModuleFileExtensionWriter &Writer) {<br>
> // Enter the extension block.<br>
> @@ -4860,6 +4874,7 @@ ASTFileSignature ASTWriter::WriteASTCore<br>
> WriteMSStructPragmaOptions(<wbr>SemaRef);<br>
> WriteMSPointersToMembersPragma<wbr>Options(SemaRef);<br>
> }<br>
> + WritePackPragmaOptions(<wbr>SemaRef);<br>
><br>
> // Some simple statistics<br>
> RecordData::value_type Record[] = {<br>
><br>
> Modified: cfe/trunk/test/Modules/Inputs/<wbr>module.map<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=299226&r1=299225&r2=299226&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/module.map?rev=<wbr>299226&r1=299225&r2=299226&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/test/Modules/Inputs/<wbr>module.map (original)<br>
> +++ cfe/trunk/test/Modules/Inputs/<wbr>module.map Fri Mar 31 10:36:21 2017<br>
> @@ -265,6 +265,22 @@ module diag_pragma {<br>
> header "diag_pragma.h"<br>
> }<br>
><br>
> +module pragma_pack_set {<br>
> + header "pragma_pack_set.h"<br>
> +}<br>
> +<br>
> +module pragma_pack_push {<br>
> + header "pragma_pack_push.h"<br>
> +}<br>
> +<br>
> +module pragma_pack_empty {<br>
> + header "empty.h"<br>
> +}<br>
> +<br>
> +module pragma_pack_reset_push {<br>
> + header "pragma_pack_reset_push.h"<br>
> +}<br>
> +<br>
> module dummy {<br>
> header "dummy.h"<br>
> }<br>
><br>
> Added: cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_push.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/pragma_pack_push.h?rev=299226&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/pragma_pack_<wbr>push.h?rev=299226&view=auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_push.h (added)<br>
> +++ cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_push.h Fri Mar 31 10:36:21 2017<br>
> @@ -0,0 +1,6 @@<br>
> +<br>
> +#pragma pack (push, 4)<br>
> +#pragma pack (push, 2)<br>
> +#pragma pack (push, 1)<br>
> +#pragma pack (pop)<br>
> +<br>
><br>
> Added: cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_reset_push.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/pragma_pack_reset_push.h?rev=299226&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/pragma_pack_<wbr>reset_push.h?rev=299226&view=<wbr>auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_reset_push.h (added)<br>
> +++ cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_reset_push.h Fri Mar 31 10:36:21 2017<br>
> @@ -0,0 +1,4 @@<br>
> +<br>
> +#pragma pack ()<br>
> +#pragma pack (push, 4)<br>
> +<br>
><br>
> Added: cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_set.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/pragma_pack_set.h?rev=299226&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/Inputs/pragma_pack_<wbr>set.h?rev=299226&view=auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_set.h (added)<br>
> +++ cfe/trunk/test/Modules/Inputs/<wbr>pragma_pack_set.h Fri Mar 31 10:36:21 2017<br>
> @@ -0,0 +1,3 @@<br>
> +<br>
> +#pragma pack (1)<br>
> +<br>
><br>
> Added: cfe/trunk/test/Modules/pragma-<wbr>pack.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pragma-pack.c?rev=299226&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Modules/pragma-pack.c?rev=<wbr>299226&view=auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/test/Modules/pragma-<wbr>pack.c (added)<br>
> +++ cfe/trunk/test/Modules/pragma-<wbr>pack.c Fri Mar 31 10:36:21 2017<br>
> @@ -0,0 +1,35 @@<br>
> +// RUN: rm -rf %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=pragma_pack_set %S/Inputs/module.map<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=pragma_pack_push %S/Inputs/module.map<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=pragma_pack_<wbr>empty %S/Inputs/module.map<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=pragma_pack_<wbr>reset_push %S/Inputs/module.map<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s<br>
> +// FIXME: When we have a syntax for modules in C, use that.<br>
> +<br>
> +@import pragma_pack_set;<br>
> +<br>
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 1}}<br>
> +#pragma pack (pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}<br>
> +<br>
> +@import pragma_pack_push;<br>
> +<br>
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 2}}<br>
> +#pragma pack (pop)<br>
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 4}}<br>
> +#pragma pack (pop)<br>
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 1}}<br>
> +#pragma pack (pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}<br>
> +<br>
> +#pragma pack (16)<br>
> +<br>
> +@import pragma_pack_empty;<br>
> +<br>
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 16}}<br>
> +#pragma pack (pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}<br>
> +<br>
> +@import pragma_pack_reset_push;<br>
> +<br>
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 4}}<br>
> +#pragma pack (pop)<br>
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 8}}<br>
> +<br>
><br>
> Added: cfe/trunk/test/PCH/pragma-<wbr>pack.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/pragma-pack.c?rev=299226&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/PCH/<wbr>pragma-pack.c?rev=299226&view=<wbr>auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/test/PCH/pragma-<wbr>pack.c (added)<br>
> +++ cfe/trunk/test/PCH/pragma-<wbr>pack.c Fri Mar 31 10:36:21 2017<br>
> @@ -0,0 +1,90 @@<br>
> +// Test this without pch.<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DSET<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DRESET<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DPUSH<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DPUSH_POP<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DPUSH_POP_LABEL<br>
> +<br>
> +// Test with pch.<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DSET -emit-pch -o %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DSET -verify -include-pch %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DRESET -emit-pch -o %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DRESET -verify -include-pch %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH -emit-pch -o %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH -verify -include-pch %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP -emit-pch -o %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP -verify -include-pch %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP_LABEL -emit-pch -o %t<br>
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP_LABEL -verify -include-pch %t<br>
> +<br>
> +#ifndef HEADER<br>
> +#define HEADER<br>
> +<br>
> +#ifdef SET<br>
> +#pragma pack(1)<br>
> +#endif<br>
> +<br>
> +#ifdef RESET<br>
> +#pragma pack(2)<br>
> +#pragma pack ()<br>
> +#endif<br>
> +<br>
> +#ifdef PUSH<br>
> +#pragma pack(1)<br>
> +#pragma pack (push, 2)<br>
> +#endif<br>
> +<br>
> +#ifdef PUSH_POP<br>
> +#pragma pack (push, 4)<br>
> +#pragma pack (push, 2)<br>
> +#pragma pack (pop)<br>
> +#endif<br>
> +<br>
> +#ifdef PUSH_POP_LABEL<br>
> +#pragma pack (push, a, 4)<br>
> +#pragma pack (push, b, 1)<br>
> +#pragma pack (push, c, 2)<br>
> +#pragma pack (pop, b)<br>
> +#endif<br>
> +<br>
> +#else<br>
> +<br>
> +#ifdef SET<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 1}}<br>
> +#pragma pack(pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}<br>
> +#endif<br>
> +<br>
> +#ifdef RESET<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}<br>
> +#pragma ()<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}<br>
> +#endif<br>
> +<br>
> +#ifdef PUSH<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 2}}<br>
> +#pragma pack(pop)<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 1}}<br>
> +#pragma pack ()<br>
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 8}}<br>
> +#pragma pack(pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}<br>
> +#endif<br>
> +<br>
> +#ifdef PUSH_POP<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 4}}<br>
> +#pragma pack(pop)<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}<br>
> +#pragma pack(pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}<br>
> +#endif<br>
> +<br>
> +#ifdef PUSH_POP_LABEL<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 4}}<br>
> +#pragma pack(pop, c)<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 4}}<br>
> +#pragma pack(pop, a)<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}<br>
> +#pragma pack(pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}<br>
> +#pragma pack(pop, b) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}<br>
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}<br>
> +#endif<br>
> +<br>
> +#endif<br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
<br>
</div></div></blockquote></div><br></div>