diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-07-18 17:23:51 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-07-18 17:23:51 +0000 |
commit | 95c5cdeb80aaf0819eba8ddd4421d04be5e271ff (patch) | |
tree | 394db054f724617b57bbbde190b36206150aa688 /include/clang/Sema/Sema.h | |
parent | 149c4361fbaff25f1aaea466d5350665ab7fa5d3 (diff) |
Add a warning for missing '#pragma pack (pop)' and suspicious uses
of '#pragma pack' in included files
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
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@308327 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Sema/Sema.h')
-rw-r--r-- | include/clang/Sema/Sema.h | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 49d626755e..44c1124a69 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -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,8 @@ 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. + SmallVector<std::pair<unsigned, SourceLocation>, 8> PackIncludeStack; // Segment #pragmas. PragmaStack<StringLiteral *> DataSegStack; PragmaStack<StringLiteral *> BSSSegStack; @@ -8185,6 +8191,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); @@ -10378,6 +10393,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; |