diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-07-31 13:37:50 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-07-31 13:37:50 +0000 |
commit | a1479d798870798277e70006cfe1e131c2c0a37c (patch) | |
tree | a8f2d0d67aa88983fa94b8f18696ac53eec23f6a /clang/lib/Sema/SemaAttr.cpp | |
parent | e841b214b15bcc6044ffbe61f60b78b6a7c64492 (diff) | |
download | bcm5719-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.cpp | 16 |
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) { |