r309386 - Recommit r308327 3rd time: Add a warning for missing

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 26 09:02:03 PDT 2017


Another bit of feedback: The Microsoft SDK has pragma adjustment headers
that are used like so:

#include <pshpack1.h>
// Define structs with alignment 1 here
#include <poppack.h>

This warning fires on that. I haven't seen these headers in active use
recently, but I remember seeing them quite a bit maybe 10 years ago. (It
took me until today to remember their names.) Any ideas on how to deal with
that?

On Fri, Jul 28, 2017 at 2:41 PM, Alex Lorenz via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: arphaman
> Date: Fri Jul 28 07:41:21 2017
> New Revision: 309386
>
> URL: http://llvm.org/viewvc/llvm-project?rev=309386&view=rev
> Log:
> Recommit r308327 3rd time: Add a warning for missing
> '#pragma pack (pop)' and suspicious uses of '#pragma pack' in included
> files
>
> The second recommit (r309106) was reverted because the "non-default #pragma
> pack value chages the alignment of struct or union members in the included
> file"
> warning proved to be too aggressive for external projects like Chromium
> (https://bugs.chromium.org/p/chromium/issues/detail?id=749197). This
> recommit
> makes the problematic warning a non-default one, and gives it the
> -Wpragma-pack-suspicious-include warning option.
>
> The first recommit (r308441) caused a "non-default #pragma pack value might
> change the alignment of struct or union members in the included file"
> warning
> in LLVM itself. This recommit tweaks the added warning to avoid warnings
> for
> #includes that don't have any records that are affected by the non-default
> alignment. This tweak avoids the previously emitted warning in LLVM.
>
> Original message:
>
> This commit adds a new -Wpragma-pack warning. It warns in the following
> cases:
>
> - When a translation unit is missing terminating #pragma pack (pop)
> directives.
> - When entering an included file if the current alignment value as
> determined
>   by '#pragma pack' directives is different from the default alignment
> value.
> - When leaving an included file that changed the state of the current
> alignment
>   value.
>
> rdar://10184173
>
> Differential Revision: https://reviews.llvm.org/D35484
>
> Added:
>     cfe/trunk/test/PCH/suspicious-pragma-pack.c
>     cfe/trunk/test/Sema/Inputs/pragma-pack1.h
>     cfe/trunk/test/Sema/Inputs/pragma-pack2.h
>     cfe/trunk/test/Sema/suspicious-pragma-pack.c
>     cfe/trunk/test/SemaObjC/Inputs/empty.h
>     cfe/trunk/test/SemaObjC/suspicious-pragma-pack.m
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/include/clang/Lex/PPCallbacks.h
>     cfe/trunk/include/clang/Sema/Sema.h
>     cfe/trunk/include/clang/Serialization/ASTReader.h
>     cfe/trunk/lib/Parse/ParsePragma.cpp
>     cfe/trunk/lib/Sema/Sema.cpp
>     cfe/trunk/lib/Sema/SemaAttr.cpp
>     cfe/trunk/lib/Serialization/ASTReader.cpp
>     cfe/trunk/lib/Serialization/ASTWriter.cpp
>     cfe/trunk/test/OpenMP/declare_simd_messages.cpp
>     cfe/trunk/test/PCH/pragma-pack.c
>     cfe/trunk/test/Parser/pragma-options.c
>     cfe/trunk/test/Parser/pragma-options.cpp
>     cfe/trunk/test/Parser/pragma-pack.c
>     cfe/trunk/test/Sema/pragma-pack.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/DiagnosticGroups.td?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Fri Jul 28 07:41:21
> 2017
> @@ -471,8 +471,10 @@ def IgnoredPragmaIntrinsic : DiagGroup<"
>  def UnknownPragmas : DiagGroup<"unknown-pragmas">;
>  def IgnoredPragmas : DiagGroup<"ignored-pragmas",
> [IgnoredPragmaIntrinsic]>;
>  def PragmaClangAttribute : DiagGroup<"pragma-clang-attribute">;
> +def PragmaPackSuspiciousInclude : DiagGroup<"pragma-pack-
> suspicious-include">;
> +def PragmaPack : DiagGroup<"pragma-pack", [PragmaPackSuspiciousInclude]>;
>  def Pragmas : DiagGroup<"pragmas", [UnknownPragmas, IgnoredPragmas,
> -                                    PragmaClangAttribute]>;
> +                                    PragmaClangAttribute, PragmaPack]>;
>  def UnknownWarningOption : DiagGroup<"unknown-warning-option">;
>  def NSobjectAttribute : DiagGroup<"NSObject-attribute">;
>  def IndependentClassAttribute : DiagGroup<"IndependentClass-attribute">;
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/
> DiagnosticSemaKinds.td?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Jul 28
> 07:41:21 2017
> @@ -712,6 +712,17 @@ def err_pragma_options_align_mac68k_targ
>  def warn_pragma_pack_invalid_alignment : Warning<
>    "expected #pragma pack parameter to be '1', '2', '4', '8', or '16'">,
>    InGroup<IgnoredPragmas>;
> +def warn_pragma_pack_non_default_at_include : Warning<
> +  "non-default #pragma pack value changes the alignment of struct or
> union "
> +  "members in the included file">, InGroup<PragmaPackSuspiciousInclude>,
> +  DefaultIgnore;
> +def warn_pragma_pack_modified_after_include : Warning<
> +  "the current #pragma pack aligment value is modified in the included "
> +  "file">, InGroup<PragmaPack>;
> +def warn_pragma_pack_no_pop_eof : Warning<"unterminated "
> +  "'#pragma pack (push, ...)' at end of file">, InGroup<PragmaPack>;
> +def note_pragma_pack_here : Note<
> +  "previous '#pragma pack' directive that modifies alignment is here">;
>  // Follow the Microsoft implementation.
>  def warn_pragma_pack_show : Warning<"value of #pragma pack(show) == %0">;
>  def warn_pragma_pack_pop_identifer_and_alignment : Warning<
>
> Modified: cfe/trunk/include/clang/Lex/PPCallbacks.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Lex/PPCallbacks.h?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Lex/PPCallbacks.h (original)
> +++ cfe/trunk/include/clang/Lex/PPCallbacks.h Fri Jul 28 07:41:21 2017
> @@ -381,6 +381,12 @@ public:
>      Second->Ident(Loc, str);
>    }
>
> +  void PragmaDirective(SourceLocation Loc,
> +                       PragmaIntroducerKind Introducer) override {
> +    First->PragmaDirective(Loc, Introducer);
> +    Second->PragmaDirective(Loc, Introducer);
> +  }
> +
>    void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
>                       StringRef Str) override {
>      First->PragmaComment(Loc, Kind, Str);
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Sema/Sema.h?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Fri Jul 28 07:41:21 2017
> @@ -208,6 +208,7 @@ namespace sema {
>    class FunctionScopeInfo;
>    class LambdaScopeInfo;
>    class PossiblyUnreachableDiag;
> +  class SemaPPCallbacks;
>    class TemplateDeductionInfo;
>  }
>
> @@ -381,11 +382,12 @@ public:
>        llvm::StringRef StackSlotLabel;
>        ValueType Value;
>        SourceLocation PragmaLocation;
> -      Slot(llvm::StringRef StackSlotLabel,
> -           ValueType Value,
> -           SourceLocation PragmaLocation)
> -        : StackSlotLabel(StackSlotLabel), Value(Value),
> -          PragmaLocation(PragmaLocation) {}
> +      SourceLocation PragmaPushLocation;
> +      Slot(llvm::StringRef StackSlotLabel, ValueType Value,
> +           SourceLocation PragmaLocation, SourceLocation
> PragmaPushLocation)
> +          : StackSlotLabel(StackSlotLabel), Value(Value),
> +            PragmaLocation(PragmaLocation),
> +            PragmaPushLocation(PragmaPushLocation) {}
>      };
>      void Act(SourceLocation PragmaLocation,
>               PragmaMsStackAction Action,
> @@ -416,6 +418,8 @@ public:
>      explicit PragmaStack(const ValueType &Default)
>          : DefaultValue(Default), CurrentValue(Default) {}
>
> +    bool hasValue() const { return CurrentValue != DefaultValue; }
> +
>      SmallVector<Slot, 2> Stack;
>      ValueType DefaultValue; // Value used for PSK_Reset action.
>      ValueType CurrentValue;
> @@ -437,6 +441,13 @@ public:
>    // Sentinel to represent when the stack is set to mac68k alignment.
>    static const unsigned kMac68kAlignmentSentinel = ~0U;
>    PragmaStack<unsigned> PackStack;
> +  // The current #pragma pack values and locations at each #include.
> +  struct PackIncludeState {
> +    unsigned CurrentValue;
> +    SourceLocation CurrentPragmaLocation;
> +    bool HasNonDefaultValue, ShouldWarnOnInclude;
> +  };
> +  SmallVector<PackIncludeState, 8> PackIncludeStack;
>    // Segment #pragmas.
>    PragmaStack<StringLiteral *> DataSegStack;
>    PragmaStack<StringLiteral *> BSSSegStack;
> @@ -8182,6 +8193,15 @@ public:
>    void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction
> Action,
>                         StringRef SlotLabel, Expr *Alignment);
>
> +  enum class PragmaPackDiagnoseKind {
> +    NonDefaultStateAtInclude,
> +    ChangedStateAtExit
> +  };
> +
> +  void DiagnoseNonDefaultPragmaPack(PragmaPackDiagnoseKind Kind,
> +                                    SourceLocation IncludeLoc);
> +  void DiagnoseUnterminatedPragmaPack();
> +
>    /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct
> [on|off].
>    void ActOnPragmaMSStruct(PragmaMSStructKind Kind);
>
> @@ -10390,6 +10410,12 @@ private:
>
>    IdentifierInfo *Ident_NSError = nullptr;
>
> +  /// \brief The handler for the FileChanged preprocessor events.
> +  ///
> +  /// Used for diagnostics that implement custom semantic analysis for
> #include
> +  /// directives, like -Wpragma-pack.
> +  sema::SemaPPCallbacks *SemaPPCallbackHandler;
> +
>  protected:
>    friend class Parser;
>    friend class InitializationSequence;
>
> Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Serialization/ASTReader.h?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTReader.h Fri Jul 28 07:41:21
> 2017
> @@ -825,6 +825,7 @@ private:
>    struct PragmaPackStackEntry {
>      unsigned Value;
>      SourceLocation Location;
> +    SourceLocation PushLocation;
>      StringRef SlotLabel;
>    };
>    llvm::SmallVector<PragmaPackStackEntry, 2> PragmaPackStack;
>
> Modified: cfe/trunk/lib/Parse/ParsePragma.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/
> ParsePragma.cpp?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Parse/ParsePragma.cpp (original)
> +++ cfe/trunk/lib/Parse/ParsePragma.cpp Fri Jul 28 07:41:21 2017
> @@ -422,15 +422,20 @@ void Parser::HandlePragmaPack() {
>    assert(Tok.is(tok::annot_pragma_pack));
>    PragmaPackInfo *Info =
>      static_cast<PragmaPackInfo *>(Tok.getAnnotationValue());
> -  SourceLocation PragmaLoc = ConsumeAnnotationToken();
> +  SourceLocation PragmaLoc = Tok.getLocation();
>    ExprResult Alignment;
>    if (Info->Alignment.is(tok::numeric_constant)) {
>      Alignment = Actions.ActOnNumericConstant(Info->Alignment);
> -    if (Alignment.isInvalid())
> +    if (Alignment.isInvalid()) {
> +      ConsumeAnnotationToken();
>        return;
> +    }
>    }
>    Actions.ActOnPragmaPack(PragmaLoc, Info->Action, Info->SlotLabel,
>                            Alignment.get());
> +  // Consume the token after processing the pragma to enable
> pragma-specific
> +  // #include warnings.
> +  ConsumeAnnotationToken();
>  }
>
>  void Parser::HandlePragmaMSStruct() {
>
> Modified: cfe/trunk/lib/Sema/Sema.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> Sema.cpp?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/Sema.cpp (original)
> +++ cfe/trunk/lib/Sema/Sema.cpp Fri Jul 28 07:41:21 2017
> @@ -70,6 +70,49 @@ void Sema::ActOnTranslationUnitScope(Sco
>    PushDeclContext(S, Context.getTranslationUnitDecl());
>  }
>
> +namespace clang {
> +namespace sema {
> +
> +class SemaPPCallbacks : public PPCallbacks {
> +  Sema *S = nullptr;
> +  llvm::SmallVector<SourceLocation, 8> IncludeStack;
> +
> +public:
> +  void set(Sema &S) { this->S = &S; }
> +
> +  void reset() { S = nullptr; }
> +
> +  virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
> +                           SrcMgr::CharacteristicKind FileType,
> +                           FileID PrevFID) override {
> +    if (!S)
> +      return;
> +    switch (Reason) {
> +    case EnterFile: {
> +      SourceManager &SM = S->getSourceManager();
> +      SourceLocation IncludeLoc = SM.getIncludeLoc(SM.getFileID(Loc));
> +      if (IncludeLoc.isValid()) {
> +        IncludeStack.push_back(IncludeLoc);
> +        S->DiagnoseNonDefaultPragmaPack(
> +            Sema::PragmaPackDiagnoseKind::NonDefaultStateAtInclude,
> IncludeLoc);
> +      }
> +      break;
> +    }
> +    case ExitFile:
> +      if (!IncludeStack.empty())
> +        S->DiagnoseNonDefaultPragmaPack(
> +            Sema::PragmaPackDiagnoseKind::ChangedStateAtExit,
> +            IncludeStack.pop_back_val());
> +      break;
> +    default:
> +      break;
> +    }
> +  }
> +};
> +
> +} // end namespace sema
> +} // end namespace clang
> +
>  Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
>             TranslationUnitKind TUKind, CodeCompleteConsumer
> *CodeCompleter)
>      : ExternalSource(nullptr), isMultiplexExternalSource(false),
> @@ -122,6 +165,12 @@ Sema::Sema(Preprocessor &pp, ASTContext
>
>    // Initilization of data sharing attributes stack for OpenMP
>    InitDataSharingAttributesStack();
> +
> +  std::unique_ptr<sema::SemaPPCallbacks> Callbacks =
> +      llvm::make_unique<sema::SemaPPCallbacks>();
> +  SemaPPCallbackHandler = Callbacks.get();
> +  PP.addPPCallbacks(std::move(Callbacks));
> +  SemaPPCallbackHandler->set(*this);
>  }
>
>  void Sema::addImplicitTypedef(StringRef Name, QualType T) {
> @@ -306,6 +355,10 @@ Sema::~Sema() {
>    // Destroys data sharing attributes stack for OpenMP
>    DestroyDataSharingAttributesStack();
>
> +  // Detach from the PP callback handler which outlives Sema since it's
> owned
> +  // by the preprocessor.
> +  SemaPPCallbackHandler->reset();
> +
>    assert(DelayedTypos.empty() && "Uncorrected typos!");
>  }
>
> @@ -766,6 +819,7 @@ void Sema::ActOnEndOfTranslationUnit() {
>      CheckDelayedMemberExceptionSpecs();
>    }
>
> +  DiagnoseUnterminatedPragmaPack();
>    DiagnoseUnterminatedPragmaAttribute();
>
>    // All delayed member exception specs should be checked or we end up
> accepting
>
> Modified: cfe/trunk/lib/Sema/SemaAttr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaAttr.cpp?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaAttr.cpp Fri Jul 28 07:41:21 2017
> @@ -61,6 +61,17 @@ void Sema::AddAlignmentAttributesForReco
>        RD->addAttr(MaxFieldAlignmentAttr::CreateImplicit(Context,
>                                                          Alignment * 8));
>    }
> +  if (PackIncludeStack.empty())
> +    return;
> +  // The #pragma pack affected a record in an included file,  so Clang
> should
> +  // warn when that pragma was written in a file that included the
> included
> +  // file.
> +  for (auto &PackedInclude : llvm::reverse(PackIncludeStack)) {
> +    if (PackedInclude.CurrentPragmaLocation != PackStack.
> CurrentPragmaLocation)
> +      break;
> +    if (PackedInclude.HasNonDefaultValue)
> +      PackedInclude.ShouldWarnOnInclude = true;
> +  }
>  }
>
>  void Sema::AddMsStructLayoutForRecord(RecordDecl *RD) {
> @@ -202,6 +213,47 @@ void Sema::ActOnPragmaPack(SourceLocatio
>    PackStack.Act(PragmaLoc, Action, SlotLabel, AlignmentVal);
>  }
>
> +void Sema::DiagnoseNonDefaultPragmaPack(PragmaPackDiagnoseKind Kind,
> +                                        SourceLocation IncludeLoc) {
> +  if (Kind == PragmaPackDiagnoseKind::NonDefaultStateAtInclude) {
> +    SourceLocation PrevLocation = PackStack.CurrentPragmaLocation;
> +    // Warn about non-default alignment at #includes (without redundant
> +    // warnings for the same directive in nested includes).
> +    // The warning is delayed until the end of the file to avoid warnings
> +    // for files that don't have any records that are affected by the
> modified
> +    // alignment.
> +    bool HasNonDefaultValue =
> +        PackStack.hasValue() &&
> +        (PackIncludeStack.empty() ||
> +         PackIncludeStack.back().CurrentPragmaLocation != PrevLocation);
> +    PackIncludeStack.push_back(
> +        {PackStack.CurrentValue,
> +         PackStack.hasValue() ? PrevLocation : SourceLocation(),
> +         HasNonDefaultValue, /*ShouldWarnOnInclude*/ false});
> +    return;
> +  }
> +
> +  assert(Kind == PragmaPackDiagnoseKind::ChangedStateAtExit && "invalid
> kind");
> +  PackIncludeState PrevPackState = PackIncludeStack.pop_back_val();
> +  if (PrevPackState.ShouldWarnOnInclude) {
> +    // Emit the delayed non-default alignment at #include warning.
> +    Diag(IncludeLoc, diag::warn_pragma_pack_non_default_at_include);
> +    Diag(PrevPackState.CurrentPragmaLocation,
> diag::note_pragma_pack_here);
> +  }
> +  // Warn about modified alignment after #includes.
> +  if (PrevPackState.CurrentValue != PackStack.CurrentValue) {
> +    Diag(IncludeLoc, diag::warn_pragma_pack_modified_after_include);
> +    Diag(PackStack.CurrentPragmaLocation, diag::note_pragma_pack_here);
> +  }
> +}
> +
> +void Sema::DiagnoseUnterminatedPragmaPack() {
> +  if (PackStack.Stack.empty())
> +    return;
> +  for (const auto &StackSlot : llvm::reverse(PackStack.Stack))
> +    Diag(StackSlot.PragmaPushLocation, diag::warn_pragma_pack_no_pop_
> eof);
> +}
> +
>  void Sema::ActOnPragmaMSStruct(PragmaMSStructKind Kind) {
>    MSStructPragmaOn = (Kind == PMSST_ON);
>  }
> @@ -249,7 +301,8 @@ void Sema::PragmaStack<ValueType>::Act(S
>      return;
>    }
>    if (Action & PSK_Push)
> -    Stack.push_back(Slot(StackSlotLabel, CurrentValue,
> CurrentPragmaLocation));
> +    Stack.emplace_back(StackSlotLabel, CurrentValue,
> CurrentPragmaLocation,
> +                       PragmaLocation);
>    else if (Action & PSK_Pop) {
>      if (!StackSlotLabel.empty()) {
>        // If we've got a label, try to find it and jump there.
>
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
> Serialization/ASTReader.cpp?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Fri Jul 28 07:41:21 2017
> @@ -3382,6 +3382,7 @@ ASTReader::ReadASTBlock(ModuleFile &F, u
>          PragmaPackStackEntry Entry;
>          Entry.Value = Record[Idx++];
>          Entry.Location = ReadSourceLocation(F, Record[Idx++]);
> +        Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
>          PragmaPackStrings.push_back(ReadString(Record, Idx));
>          Entry.SlotLabel = PragmaPackStrings.back();
>          PragmaPackStack.push_back(Entry);
> @@ -7570,13 +7571,14 @@ void ASTReader::UpdateSema() {
>               "Expected a default alignment value");
>        SemaObj->PackStack.Stack.emplace_back(
>            PragmaPackStack.front().SlotLabel, SemaObj->PackStack.
> CurrentValue,
> -          SemaObj->PackStack.CurrentPragmaLocation);
> +          SemaObj->PackStack.CurrentPragmaLocation,
> +          PragmaPackStack.front().PushLocation);
>        DropFirst = true;
>      }
>      for (const auto &Entry :
>           llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 :
> 0))
>        SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value,
> -                                            Entry.Location);
> +                                            Entry.Location,
> Entry.PushLocation);
>      if (PragmaPackCurrentLocation.isInvalid()) {
>        assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue
> &&
>               "Expected a default alignment value");
>
> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
> Serialization/ASTWriter.cpp?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri Jul 28 07:41:21 2017
> @@ -4295,6 +4295,7 @@ void ASTWriter::WritePackPragmaOptions(S
>    for (const auto &StackEntry : SemaRef.PackStack.Stack) {
>      Record.push_back(StackEntry.Value);
>      AddSourceLocation(StackEntry.PragmaLocation, Record);
> +    AddSourceLocation(StackEntry.PragmaPushLocation, Record);
>      AddString(StackEntry.StackSlotLabel, Record);
>    }
>    Stream.EmitRecord(PACK_PRAGMA_OPTIONS, Record);
>
> Modified: cfe/trunk/test/OpenMP/declare_simd_messages.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/
> declare_simd_messages.cpp?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/OpenMP/declare_simd_messages.cpp (original)
> +++ cfe/trunk/test/OpenMP/declare_simd_messages.cpp Fri Jul 28 07:41:21
> 2017
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 -triple=x86_64-pc-win32 -verify -fopenmp -x c++
> -std=c++11 -fms-extensions %s
> +// RUN: %clang_cc1 -triple=x86_64-pc-win32 -verify -fopenmp -x c++
> -std=c++11 -fms-extensions -Wno-pragma-pack %s
>
>  // expected-error at +1 {{expected an OpenMP directive}}
>  #pragma omp declare
>
> Modified: cfe/trunk/test/PCH/pragma-pack.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/
> pragma-pack.c?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/PCH/pragma-pack.c (original)
> +++ cfe/trunk/test/PCH/pragma-pack.c Fri Jul 28 07:41:21 2017
> @@ -1,21 +1,21 @@
>  // Test this without pch.
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -DSET
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -DRESET
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -DPUSH
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -DPUSH_POP
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -DPUSH_POP_LABEL
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -Wno-pragma-pack -DSET
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -Wno-pragma-pack -DRESET
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -Wno-pragma-pack -DPUSH
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -Wno-pragma-pack -DPUSH_POP
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify
> -fsyntax-only -Wno-pragma-pack -DPUSH_POP_LABEL
>
>  // Test with pch.
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DSET -emit-pch -o %t
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DSET -verify
> -include-pch %t
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DRESET -emit-pch -o
> %t
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DRESET -verify
> -include-pch %t
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH -emit-pch -o %t
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH -verify
> -include-pch %t
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP -emit-pch
> -o %t
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP -verify
> -include-pch %t
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP_LABEL
> -emit-pch -o %t
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP_LABEL
> -verify -include-pch %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DSET -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DSET -verify -include-pch %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DRESET -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DRESET -verify -include-pch %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DPUSH -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DPUSH -verify -include-pch %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DPUSH_POP -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DPUSH_POP -verify -include-pch %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DPUSH_POP_LABEL -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -Wno-pragma-pack
> -DPUSH_POP_LABEL -verify -include-pch %t
>
>  #ifndef HEADER
>  #define HEADER
>
> Added: cfe/trunk/test/PCH/suspicious-pragma-pack.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/
> suspicious-pragma-pack.c?rev=309386&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/PCH/suspicious-pragma-pack.c (added)
> +++ cfe/trunk/test/PCH/suspicious-pragma-pack.c Fri Jul 28 07:41:21 2017
> @@ -0,0 +1,8 @@
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -verify -emit-pch -o
> %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -verify -include-pch
> %t
> +
> +#ifndef HEADER
> +#define HEADER
> +#pragma pack (push, 1)
> +#endif
> +// expected-warning at -2 {{unterminated '#pragma pack (push, ...)' at end
> of file}}
>
> Modified: cfe/trunk/test/Parser/pragma-options.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/
> pragma-options.c?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/Parser/pragma-options.c (original)
> +++ cfe/trunk/test/Parser/pragma-options.c Fri Jul 28 07:41:21 2017
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify %s
> +// RUN: %clang_cc1 -triple i386-apple-darwin9 -Wno-pragma-pack
> -fsyntax-only -verify %s
>
>  /* expected-warning {{expected 'align' following '#pragma options'}} */
> #pragma options
>  /* expected-warning {{expected '=' following '#pragma options align'}} */
> #pragma options align
>
> Modified: cfe/trunk/test/Parser/pragma-options.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/
> pragma-options.cpp?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/Parser/pragma-options.cpp (original)
> +++ cfe/trunk/test/Parser/pragma-options.cpp Fri Jul 28 07:41:21 2017
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify %s
> +// RUN: %clang_cc1 -triple i386-apple-darwin9 -Wno-pragma-pack
> -fsyntax-only -verify %s
>  // expected-no-diagnostics
>
>  class C {
>
> Modified: cfe/trunk/test/Parser/pragma-pack.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/
> pragma-pack.c?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/Parser/pragma-pack.c (original)
> +++ cfe/trunk/test/Parser/pragma-pack.c Fri Jul 28 07:41:21 2017
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 -fsyntax-only -verify %s
> +// RUN: %clang_cc1 -fsyntax-only -Wno-pragma-pack -verify %s
>
>  // Note that this puts the expected lines before the directives to work
> around
>  // limitations in the -verify mode.
>
> Added: cfe/trunk/test/Sema/Inputs/pragma-pack1.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/
> Inputs/pragma-pack1.h?rev=309386&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/Sema/Inputs/pragma-pack1.h (added)
> +++ cfe/trunk/test/Sema/Inputs/pragma-pack1.h Fri Jul 28 07:41:21 2017
> @@ -0,0 +1,27 @@
> +
> +#ifndef NO_RECORD_1
> +struct ReceivesPragma { };
> +#endif
> +
> +#ifdef SET_FIRST_HEADER
> +#pragma pack (16)
> +#ifndef SET_SECOND_HEADER
> +// expected-note at -2 2 {{previous '#pragma pack' directive that modifies
> alignment is here}}
> +#else
> +// expected-note at -4 1 {{previous '#pragma pack' directive that modifies
> alignment is here}}
> +#endif
> +// expected-warning at +3 {{non-default #pragma pack value changes the
> alignment of struct or union members in the included file}}
> +#endif
> +
> +#include "pragma-pack2.h"
> +
> +#ifdef SET_SECOND_HEADER
> +// expected-warning at -3 {{the current #pragma pack aligment value is
> modified in the included file}}
> +#endif
> +
> +#ifdef PUSH_POP_FIRST_HEADER
> +// This is fine, we don't change the current value.
> +#pragma pack (push, 4)
> +
> +#pragma pack (pop)
> +#endif
>
> Added: cfe/trunk/test/Sema/Inputs/pragma-pack2.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/
> Inputs/pragma-pack2.h?rev=309386&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/Sema/Inputs/pragma-pack2.h (added)
> +++ cfe/trunk/test/Sema/Inputs/pragma-pack2.h Fri Jul 28 07:41:21 2017
> @@ -0,0 +1,8 @@
> +
> +#ifndef NO_RECORD_2
> +struct S { int x; };
> +#endif
> +
> +#ifdef SET_SECOND_HEADER
> +#pragma pack (8) // expected-note 2 {{previous '#pragma pack' directive
> that modifies alignment is here}}
> +#endif
>
> Modified: cfe/trunk/test/Sema/pragma-pack.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/
> pragma-pack.c?rev=309386&r1=309385&r2=309386&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/Sema/pragma-pack.c (original)
> +++ cfe/trunk/test/Sema/pragma-pack.c Fri Jul 28 07:41:21 2017
> @@ -25,3 +25,8 @@
>  #pragma pack(pop, 16)
>  /* expected-warning {{value of #pragma pack(show) == 16}} */ #pragma
> pack(show)
>
> +
> +// Warn about unbalanced pushes.
> +#pragma pack (push,4) // expected-warning {{unterminated '#pragma pack
> (push, ...)' at end of file}}
> +#pragma pack (push)   // expected-warning {{unterminated '#pragma pack
> (push, ...)' at end of file}}
> +#pragma pack ()
>
> Added: cfe/trunk/test/Sema/suspicious-pragma-pack.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/
> suspicious-pragma-pack.c?rev=309386&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/Sema/suspicious-pragma-pack.c (added)
> +++ cfe/trunk/test/Sema/suspicious-pragma-pack.c Fri Jul 28 07:41:21 2017
> @@ -0,0 +1,50 @@
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DSAFE -verify %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_HERE -DSAFE -verify %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_HERE -DPUSH_SET_HERE -verify %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_HERE -DRESET_HERE -DSAFE -verify %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_HERE -DSET_FIRST_HEADER -DWARN_MODIFIED_HEADER -verify
> %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_HERE -DRESET_HERE -DSET_FIRST_HEADER
> -DWARN_MODIFIED_HEADER -verify %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_HERE -DPUSH_SET_HERE -DSET_FIRST_HEADER
> -DWARN_MODIFIED_HEADER -verify %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_HERE -DPUSH_SET_HERE -DSET_SECOND_HEADER
> -DWARN_MODIFIED_HEADER -verify %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_HERE -DPUSH_SET_HERE -DSET_FIRST_HEADER
> -DSET_SECOND_HEADER -DWARN_MODIFIED_HEADER -verify %s
> +
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_POP_FIRST_HEADER -DSAFE -verify %s
> +
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -I %S/Inputs -DPUSH_SET_HERE -DNO_RECORD_1 -DNO_RECORD_2 -DSAFE -verify %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only
> -Wpragma-pack-suspicious-include -I %S/Inputs -DPUSH_SET_HERE
> -DNO_RECORD_1 -verify %s
> +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -Wpragma-pack
> -Wno-pragma-pack-suspicious-include -I %S/Inputs -DPUSH_SET_HERE
> -DNO_RECORD_1 -DSAFE -verify %s
> +
> +#ifdef SAFE
> +// expected-no-diagnostics
> +#endif
> +
> +#ifdef PUSH_HERE
> +#pragma pack (push)
> +#endif
> +
> +#ifdef PUSH_SET_HERE
> +#pragma pack (push, 4)
> +#ifndef SAFE
> +// expected-note at -2 {{previous '#pragma pack' directive that modifies
> alignment is here}}
> +// expected-warning at +9 {{non-default #pragma pack value changes the
> alignment of struct or union members in the included file}}
> +#endif
> +#endif
> +
> +#ifdef RESET_HERE
> +#pragma pack (4)
> +#pragma pack () // no warning after reset as the value is default.
> +#endif
> +
> +#include "pragma-pack1.h"
> +
> +#ifdef WARN_MODIFIED_HEADER
> +// expected-warning at -3 {{the current #pragma pack aligment value is
> modified in the included file}}
> +#endif
> +
> +#ifdef PUSH_SET_HERE
> +#pragma pack (pop)
> +#endif
> +
> +#ifdef PUSH_HERE
> +#pragma pack (pop)
> +#endif
>
> Added: cfe/trunk/test/SemaObjC/Inputs/empty.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaObjC/Inputs/empty.h?rev=309386&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/SemaObjC/Inputs/empty.h (added)
> +++ cfe/trunk/test/SemaObjC/Inputs/empty.h Fri Jul 28 07:41:21 2017
> @@ -0,0 +1 @@
> +struct S { int x; };
>
> Added: cfe/trunk/test/SemaObjC/suspicious-pragma-pack.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaObjC/suspicious-pragma-pack.m?rev=309386&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/SemaObjC/suspicious-pragma-pack.m (added)
> +++ cfe/trunk/test/SemaObjC/suspicious-pragma-pack.m Fri Jul 28 07:41:21
> 2017
> @@ -0,0 +1,6 @@
> +// RUN: %clang_cc1 -Wpragma-pack-suspicious-include -triple
> i686-apple-darwin9 -fsyntax-only -I%S/Inputs -verify %s
> +
> +#pragma pack (push, 1) // expected-note {{previous '#pragma pack'
> directive that modifies alignment is here}}
> +#import "empty.h" // expected-warning {{non-default #pragma pack value
> changes the alignment of struct or union members in the included file}}
> +
> +#pragma pack (pop)
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170926/683f80ea/attachment-0001.html>


More information about the cfe-commits mailing list