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