Index: clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def =================================================================== --- clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def +++ clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def @@ -306,10 +306,6 @@ "Whether to place an event at each tracked condition.", false) -ANALYZER_OPTION(bool, ShouldEmitFixItHintsAsRemarks, "fixits-as-remarks", - "Emit fix-it hints as remarks for testing purposes", - false) - ANALYZER_OPTION(bool, ShouldApplyFixIts, "apply-fixits", "Apply the fix-it hints to the files", false) Index: clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp =================================================================== --- clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -90,8 +90,7 @@ DiagnosticsEngine &Diag; LangOptions LO; - bool IncludePath = false, ShouldEmitAsError = false, FixitsAsRemarks = false, - ApplyFixIts = false; + bool IncludePath = false, ShouldEmitAsError = false, ApplyFixIts = false; public: ClangDiagPathDiagConsumer(DiagnosticsEngine &Diag, LangOptions LO) @@ -108,7 +107,6 @@ void enablePaths() { IncludePath = true; } void enableWerror() { ShouldEmitAsError = true; } - void enableFixitsAsRemarks() { FixitsAsRemarks = true; } void enableFixItApplication() { ApplyFixIts = true; } void FlushDiagnosticsImpl(std::vector &Diags, @@ -118,43 +116,25 @@ ? Diag.getCustomDiagID(DiagnosticsEngine::Error, "%0") : Diag.getCustomDiagID(DiagnosticsEngine::Warning, "%0"); unsigned NoteID = Diag.getCustomDiagID(DiagnosticsEngine::Note, "%0"); - unsigned RemarkID = Diag.getCustomDiagID(DiagnosticsEngine::Remark, "%0"); SourceManager &SM = Diag.getSourceManager(); Replacements Repls; auto reportPiece = [&](unsigned ID, FullSourceLoc Loc, StringRef String, ArrayRef Ranges, ArrayRef Fixits) { - if (!FixitsAsRemarks && !ApplyFixIts) { + if (!ApplyFixIts) { Diag.Report(Loc, ID) << String << Ranges << Fixits; return; } Diag.Report(Loc, ID) << String << Ranges; - if (FixitsAsRemarks) { - for (const FixItHint &Hint : Fixits) { - llvm::SmallString<128> Str; - llvm::raw_svector_ostream OS(Str); - // FIXME: Add support for InsertFromRange and - // BeforePreviousInsertion. - assert(!Hint.InsertFromRange.isValid() && "Not implemented yet!"); - assert(!Hint.BeforePreviousInsertions && "Not implemented yet!"); - OS << SM.getSpellingColumnNumber(Hint.RemoveRange.getBegin()) << "-" - << SM.getSpellingColumnNumber(Hint.RemoveRange.getEnd()) << ": '" - << Hint.CodeToInsert << "'"; - Diag.Report(Loc, RemarkID) << OS.str(); - } - } + for (const FixItHint &Hint : Fixits) { + Replacement Repl(SM, Hint.RemoveRange, Hint.CodeToInsert); - if (ApplyFixIts) { - for (const FixItHint &Hint : Fixits) { - Replacement Repl(SM, Hint.RemoveRange, Hint.CodeToInsert); - - if (llvm::Error Err = Repls.add(Repl)) { - llvm::errs() << "An error occured during fix-it replacement:\n'" - << Repl.toString() << "'\nThe error message: '" << Err - << "'\n"; - } + if (llvm::Error Err = Repls.add(Repl)) { + llvm::errs() << "An error occured during fix-it replacement:\n'" + << Repl.toString() << "'\nThe error message: '" << Err + << "'\n"; } } }; @@ -297,9 +277,6 @@ if (Opts->AnalyzerWerror) clangDiags->enableWerror(); - if (Opts->ShouldEmitFixItHintsAsRemarks) - clangDiags->enableFixitsAsRemarks(); - if (Opts->ShouldApplyFixIts) clangDiags->enableFixItApplication(); Index: clang/test/Analysis/analyzer-config.c =================================================================== --- clang/test/Analysis/analyzer-config.c +++ clang/test/Analysis/analyzer-config.c @@ -58,7 +58,6 @@ // CHECK-NEXT: experimental-enable-naive-ctu-analysis = false // CHECK-NEXT: exploration_strategy = unexplored_first_queue // CHECK-NEXT: faux-bodies = true -// CHECK-NEXT: fixits-as-remarks = false // CHECK-NEXT: graph-trim-interval = 1000 // CHECK-NEXT: inline-lambdas = true // CHECK-NEXT: ipa = dynamic-bifurcate @@ -100,4 +99,4 @@ // CHECK-NEXT: unroll-loops = false // CHECK-NEXT: widen-loops = false // CHECK-NEXT: [stats] -// CHECK-NEXT: num-entries = 97 +// CHECK-NEXT: num-entries = 96 Index: clang/test/Analysis/dead-stores.c =================================================================== --- clang/test/Analysis/dead-stores.c +++ clang/test/Analysis/dead-stores.c @@ -1,16 +1,16 @@ -// RUN: %clang_analyze_cc1 -Wunused-variable -fblocks -Wno-unreachable-code \ +// RUN: %check_analyzer_fixit %s %t \ +// RUN: -Wunused-variable -fblocks -Wno-unreachable-code \ // RUN: -analyzer-checker=core,deadcode.DeadStores \ // RUN: -analyzer-config deadcode.DeadStores:ShowFixIts=true \ -// RUN: -analyzer-config fixits-as-remarks=true \ // RUN: -analyzer-config \ // RUN: deadcode.DeadStores:WarnForDeadNestedAssignments=false \ -// RUN: -verify=non-nested %s +// RUN: -verify=non-nested -// RUN: %clang_analyze_cc1 -Wunused-variable -fblocks -Wno-unreachable-code \ +// RUN: %check_analyzer_fixit %s %t \ +// RUN: -Wunused-variable -fblocks -Wno-unreachable-code \ // RUN: -analyzer-checker=core,deadcode.DeadStores \ // RUN: -analyzer-config deadcode.DeadStores:ShowFixIts=true \ -// RUN: -analyzer-config fixits-as-remarks=true \ -// RUN: -verify=non-nested,nested %s +// RUN: -verify=non-nested,nested void f1() { int k, y; // non-nested-warning {{unused variable 'k'}} @@ -18,14 +18,17 @@ int abc = 1; long idx = abc + 3 * 5; // non-nested-warning {{never read}} // non-nested-warning@-1 {{unused variable 'idx'}} - // non-nested-remark@-2 {{11-24: ''}} + // CHECK-FIXES: int abc = 1; + // CHECK-FIXES-NEXT: long idx; } void f2(void *b) { char *c = (char *)b; // no-warning char *d = b + 1; // non-nested-warning {{never read}} // non-nested-warning@-1 {{unused variable 'd'}} - // non-nested-remark@-2 {{10-17: ''}} + // CHECK-FIXES: char *c = (char *)b; + // CHECK-FIXES-NEXT: char *d; + printf("%s", c); // non-nested-warning@-1 {{implicitly declaring library function 'printf' with type 'int (const char *, ...)'}} // non-nested-note@-2 {{include the header or explicitly provide a declaration for 'printf'}} @@ -51,7 +54,8 @@ int x = 4; // no-warning int *p = &x; // non-nested-warning {{never read}} // non-nested-warning@-1 {{unused variable 'p'}} - // non-nested-remark@-2 {{9-13: ''}} + // CHECK-FIXES: int x = 4; + // CHECK-FIXES-NEXT: int *p; } int f6() { @@ -415,7 +419,8 @@ int shouldLog = (argc > 1); // non-nested-warning@-1 {{Value stored to 'shouldLog' during its initialization is never read}} // non-nested-warning@-2 {{unused variable 'shouldLog'}} - // non-nested-remark@-3 {{16-28: ''}} + // CHECK-FIXES: void f23_pos(int argc, char **argv) { + // CHECK-FIXES-NEXT: int shouldLog; ^{ f23_aux("I did too use it!\n"); }(); @@ -428,7 +433,11 @@ int z = x + y; // non-nested-warning@-1 {{Value stored to 'z' during its initialization is never read}} // non-nested-warning@-2 {{unused variable 'z'}} - // non-nested-remark@-3 {{10-17: ''}} + // CHECK-FIXES: void f24_A(int y) { + // CHECK-FIXES-NEXT: // + // CHECK-FIXES-NEXT: int x = (y > 2); + // CHECK-FIXES-NEXT: ^{ + // CHECK-FIXES-NEXT: int z; }(); } Index: clang/test/Analysis/virtualcall-fixit.cpp =================================================================== --- clang/test/Analysis/virtualcall-fixit.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// RUN: %check_analyzer_fixit %s %t \ -// RUN: -analyzer-checker=core,optin.cplusplus.VirtualCall \ -// RUN: -analyzer-config optin.cplusplus.VirtualCall:ShowFixIts=true - -struct S { - virtual void foo(); - S() { - foo(); - // expected-warning@-1 {{Call to virtual method 'S::foo' during construction bypasses virtual dispatch}} - // CHECK-FIXES: S::foo(); - } - ~S(); -}; Index: clang/test/Analysis/virtualcall-fixits.cpp =================================================================== --- clang/test/Analysis/virtualcall-fixits.cpp +++ clang/test/Analysis/virtualcall-fixits.cpp @@ -1,10 +1,11 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.VirtualCall \ // RUN: -analyzer-config optin.cplusplus.VirtualCall:ShowFixIts=true \ // RUN: %s 2>&1 | FileCheck -check-prefix=TEXT %s -// RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.VirtualCall \ + +// RUN: %check_analyzer_fixit %s %t \ +// RUN: -analyzer-checker=core,optin.cplusplus.VirtualCall \ // RUN: -analyzer-config optin.cplusplus.VirtualCall:ShowFixIts=true \ -// RUN: -analyzer-config fixits-as-remarks=true \ -// RUN: -analyzer-output=plist -o %t.plist -verify %s +// RUN: -analyzer-output=plist -o %t.plist // RUN: cat %t.plist | FileCheck -check-prefix=PLIST %s struct S { @@ -12,7 +13,9 @@ S() { foo(); // expected-warning@-1{{Call to virtual method 'S::foo' during construction bypasses virtual dispatch}} - // expected-remark@-2{{5-5: 'S::'}} + // CHECK-FIXES: S() { + // CHECK-FIXES-NEXT: S::foo(); + // CHECK-FIXES-NEXT: } } ~S(); }; @@ -30,12 +33,12 @@ // PLIST-NEXT: remove_range // PLIST-NEXT: // PLIST-NEXT: -// PLIST-NEXT: line13 +// PLIST-NEXT: line14 // PLIST-NEXT: col5 // PLIST-NEXT: file0 // PLIST-NEXT: // PLIST-NEXT: -// PLIST-NEXT: line13 +// PLIST-NEXT: line14 // PLIST-NEXT: col4 // PLIST-NEXT: file0 // PLIST-NEXT: