summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaAttr.cpp
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2017-07-31 13:37:50 +0000
committerAlex Lorenz <arphaman@gmail.com>2017-07-31 13:37:50 +0000
commita1479d798870798277e70006cfe1e131c2c0a37c (patch)
treea8f2d0d67aa88983fa94b8f18696ac53eec23f6a /clang/lib/Sema/SemaAttr.cpp
parente841b214b15bcc6044ffbe61f60b78b6a7c64492 (diff)
downloadbcm5719-llvm-a1479d798870798277e70006cfe1e131c2c0a37c.tar.gz
bcm5719-llvm-a1479d798870798277e70006cfe1e131c2c0a37c.zip
-Wpragma-pack: add an additional note and fixit when warning
about unterminated push directives that are followed by a reset ('#pragma pack()') This has been suggested by Hans Wennborg. llvm-svn: 309559
Diffstat (limited to 'clang/lib/Sema/SemaAttr.cpp')
-rw-r--r--clang/lib/Sema/SemaAttr.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp
index f7f1f618739..4ba2a317e1f 100644
--- a/clang/lib/Sema/SemaAttr.cpp
+++ b/clang/lib/Sema/SemaAttr.cpp
@@ -250,8 +250,22 @@ void Sema::DiagnoseNonDefaultPragmaPack(PragmaPackDiagnoseKind Kind,
void Sema::DiagnoseUnterminatedPragmaPack() {
if (PackStack.Stack.empty())
return;
- for (const auto &StackSlot : llvm::reverse(PackStack.Stack))
+ bool IsInnermost = true;
+ for (const auto &StackSlot : llvm::reverse(PackStack.Stack)) {
Diag(StackSlot.PragmaPushLocation, diag::warn_pragma_pack_no_pop_eof);
+ // The user might have already reset the alignment, so suggest replacing
+ // the reset with a pop.
+ if (IsInnermost && PackStack.CurrentValue == PackStack.DefaultValue) {
+ DiagnosticBuilder DB = Diag(PackStack.CurrentPragmaLocation,
+ diag::note_pragma_pack_pop_instead_reset);
+ SourceLocation FixItLoc = Lexer::findLocationAfterToken(
+ PackStack.CurrentPragmaLocation, tok::l_paren, SourceMgr, LangOpts,
+ /*SkipTrailing=*/false);
+ if (FixItLoc.isValid())
+ DB << FixItHint::CreateInsertion(FixItLoc, "pop");
+ }
+ IsInnermost = false;
+ }
}
void Sema::ActOnPragmaMSStruct(PragmaMSStructKind Kind) {
OpenPOWER on IntegriCloud