diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/export-diagnostics.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/export-diagnostics.cpp --- a/clang-tools-extra/test/clang-tidy/infrastructure/export-diagnostics.cpp +++ b/clang-tools-extra/test/clang-tidy/infrastructure/export-diagnostics.cpp @@ -1,15 +1,17 @@ // RUN: grep -Ev "// *[A-Z-]+:" %s > %t-input.cpp -// RUN: clang-tidy %t-input.cpp -checks='-*,google-explicit-constructor,clang-diagnostic-missing-prototypes' -export-fixes=%t.yaml -- -Wmissing-prototypes > %t.msg 2>&1 +// RUN: not clang-tidy %t-input.cpp -checks='-*,google-explicit-constructor,clang-diagnostic-missing-prototypes' -export-fixes=%t.yaml -- -Wmissing-prototypes > %t.msg 2>&1 // RUN: FileCheck -input-file=%t.msg -check-prefix=CHECK-MESSAGES %s -implicit-check-not='{{warning|error|note}}:' // RUN: FileCheck -input-file=%t.yaml -check-prefix=CHECK-YAML %s #define X(n) void n ## n() {} X(f) +int a[-1]; // CHECK-MESSAGES: -input.cpp:2:1: warning: no previous prototype for function 'ff' [clang-diagnostic-missing-prototypes] // CHECK-MESSAGES: -input.cpp:1:19: note: expanded from macro 'X' // CHECK-MESSAGES: {{^}}note: expanded from here{{$}} // CHECK-MESSAGES: -input.cpp:2:1: note: declare 'static' if the function is not intended to be used outside of this translation unit // CHECK-MESSAGES: -input.cpp:1:14: note: expanded from macro 'X' +// CHECK-MESSAGES: -input.cpp:3:7: error: 'a' declared as an array with a negative size [clang-diagnostic-error] // CHECK-YAML: --- // CHECK-YAML-NEXT: MainSourceFile: '{{.*}}-input.cpp' @@ -42,4 +44,18 @@ // CHECK-YAML-NEXT: FilePath: '{{.*}}-input.cpp' // CHECK-YAML-NEXT: FileOffset: 13 // CHECK-YAML-NEXT: Replacements: [] +// CHECK-YAML-NEXT: Level: Warning +// CHECK-YAML-NEXT: BuildDirectory: '{{.*}}' +// CHECK-YAML-NEXT: - DiagnosticName: clang-diagnostic-error +// CHECK-YAML-NEXT: DiagnosticMessage: +// CHECK-YAML-NEXT: Message: '''a'' declared as an array with a negative size' +// CHECK-YAML-NEXT: FilePath: '{{.*}}-input.cpp' +// CHECK-YAML-NEXT: FileOffset: 41 +// CHECK-YAML-NEXT: Replacements: [] +// CHECK-YAML-NEXT: Level: Error +// CHECK-YAML-NEXT: BuildDirectory: '{{.*}}' +// CHECK-YAML-NEXT: Ranges: +// CHECK-YAML-NEXT: - FilePath: '{{.*}}-input.cpp' +// CHECK-YAML-NEXT: FileOffset: 41 +// CHECK-YAML-NEXT: Length: 1 // CHECK-YAML-NEXT: ... diff --git a/clang/include/clang/Tooling/DiagnosticsYaml.h b/clang/include/clang/Tooling/DiagnosticsYaml.h --- a/clang/include/clang/Tooling/DiagnosticsYaml.h +++ b/clang/include/clang/Tooling/DiagnosticsYaml.h @@ -77,7 +77,6 @@ std::string DiagnosticName; clang::tooling::DiagnosticMessage Message; - llvm::StringMap Fix; SmallVector Notes; clang::tooling::Diagnostic::Level DiagLevel; std::string BuildDirectory; @@ -90,9 +89,9 @@ Io.mapRequired("DiagnosticName", Keys->DiagnosticName); Io.mapRequired("DiagnosticMessage", Keys->Message); Io.mapOptional("Notes", Keys->Notes); + Io.mapOptional("Level", Keys->DiagLevel); + Io.mapOptional("BuildDirectory", Keys->BuildDirectory); Io.mapOptional("Ranges", Keys->Ranges); - - // FIXME: Export properly all the different fields. } }; @@ -104,6 +103,14 @@ Io.mapRequired("Diagnostics", Doc.Diagnostics); } }; + +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &IO, clang::tooling::Diagnostic::Level &Value) { + IO.enumCase(Value, "Warning", clang::tooling::Diagnostic::Warning); + IO.enumCase(Value, "Error", clang::tooling::Diagnostic::Error); + } +}; + } // end namespace yaml } // end namespace llvm diff --git a/clang/unittests/Tooling/DiagnosticsYamlTest.cpp b/clang/unittests/Tooling/DiagnosticsYamlTest.cpp --- a/clang/unittests/Tooling/DiagnosticsYamlTest.cpp +++ b/clang/unittests/Tooling/DiagnosticsYamlTest.cpp @@ -65,6 +65,8 @@ " Offset: 100\n" " Length: 12\n" " ReplacementText: 'replacement #1'\n" + " Level: Warning\n" + " BuildDirectory: 'path/to/build/directory'\n" " - DiagnosticName: 'diagnostic#2'\n" " DiagnosticMessage:\n" " Message: 'message #2'\n" @@ -75,6 +77,8 @@ " Offset: 62\n" " Length: 2\n" " ReplacementText: 'replacement #2'\n" + " Level: Warning\n" + " BuildDirectory: 'path/to/build/directory'\n" " Ranges:\n" " - FilePath: 'path/to/source.cpp'\n" " FileOffset: 10\n" @@ -94,6 +98,8 @@ " FilePath: 'path/to/note2.cpp'\n" " FileOffset: 99\n" " Replacements: []\n" + " Level: Warning\n" + " BuildDirectory: 'path/to/build/directory'\n" "...\n"; TEST(DiagnosticsYamlTest, serializesDiagnostics) {