diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-07-19 11:30:41 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-07-19 11:30:41 +0000 |
commit | 287f684c18b74faebd913cc9d11eb3e0feab5198 (patch) | |
tree | d4285b9cc8e60f5a63bf4caa82d3463d97119abe /clang/lib/Sema/SemaAttr.cpp | |
parent | 37eadd55f71c4317ba26e294a9ae976c88e52140 (diff) | |
download | bcm5719-llvm-287f684c18b74faebd913cc9d11eb3e0feab5198.tar.gz bcm5719-llvm-287f684c18b74faebd913cc9d11eb3e0feab5198.zip |
Recommit r308327: 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
llvm-svn: 308441
Diffstat (limited to 'clang/lib/Sema/SemaAttr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaAttr.cpp | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp index 8c13ead6445..7193450220a 100644 --- a/clang/lib/Sema/SemaAttr.cpp +++ b/clang/lib/Sema/SemaAttr.cpp @@ -202,6 +202,40 @@ void Sema::ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action, 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). + if (PackStack.hasValue() && + (PackIncludeStack.empty() || + PackIncludeStack.back().second != PrevLocation)) { + Diag(IncludeLoc, diag::warn_pragma_pack_non_default_at_include); + Diag(PrevLocation, diag::note_pragma_pack_here); + } + PackIncludeStack.push_back( + {PackStack.CurrentValue, + PackStack.hasValue() ? PrevLocation : SourceLocation()}); + return; + } + + assert(Kind == PragmaPackDiagnoseKind::ChangedStateAtExit && "invalid kind"); + unsigned PreviousValue = PackIncludeStack.pop_back_val().first; + // Warn about modified alignment after #includes. + if (PreviousValue != 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 +283,8 @@ void Sema::PragmaStack<ValueType>::Act(SourceLocation PragmaLocation, 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. |