llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Nico Weber (nico)

<details>
<summary>Changes</summary>

It disables showing snippets on notes (but not on warnings and errors).

---
Full diff: https://github.com/llvm/llvm-project/pull/216250.diff


8 Files Affected:

- (modified) clang/docs/ReleaseNotes.md (+5) 
- (modified) clang/docs/UsersManual.md (+11) 
- (modified) clang/include/clang/Basic/DiagnosticOptions.def (+1) 
- (modified) clang/include/clang/Options/Options.td (+6) 
- (modified) clang/lib/Driver/ToolChains/Clang.cpp (+2) 
- (modified) clang/lib/Frontend/TextDiagnostic.cpp (+4) 
- (added) clang/test/Driver/fdiagnostics-show-note-snippets.c (+11) 
- (added) clang/test/Misc/diag-note-snippets.cpp (+41) 


``````````diff
diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 4962f9f137b5a..93bdd24d9fce0 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -210,6 +210,11 @@ features cannot lower the translation-unit ABI level;
 
 ### Improvements to Clang's diagnostics
 
+- Added `-fno-diagnostics-show-note-snippets` (and corresponding
+  `-fdiagnostics-show-note-snippets`, the default) to suppress snippets on
+  notes. Errors and warnings keep printing snippets.  This makes output much
+  shorter for diagnostics with many notes, such as overload resolution 
failures.
+
 - More consistent rendering of Unicode characters in diagnostic messages.
 
 - Fixed bug in `-Wdocumentation` so that it correctly handles explicit
diff --git a/clang/docs/UsersManual.md b/clang/docs/UsersManual.md
index 40834746e1218..b7949de748e01 100644
--- a/clang/docs/UsersManual.md
+++ b/clang/docs/UsersManual.md
@@ -268,6 +268,17 @@ test.c:28:8: warning: extra tokens at end of #endif 
directive [-Wextra-tokens]
 ```
 :::
 
+:::{option} -f[no-]diagnostics-show-note-snippets
+
+Print source line and caret snippets for note diagnostics.
+This option, which defaults to on, controls whether or not Clang
+prints the source line, source ranges, and caret for notes. When
+disabled, errors and warnings still show their snippets, but notes
+only show their message line. This makes output much shorter for
+diagnostics with many notes, such as overload resolution failures
+or template instantiation backtraces.
+:::
+
 :::{option} -f[no-]color-diagnostics
 
 This option, which defaults to on when a color-capable terminal is
diff --git a/clang/include/clang/Basic/DiagnosticOptions.def 
b/clang/include/clang/Basic/DiagnosticOptions.def
index 764e2f1fedbdd..54e389c5f6bf5 100644
--- a/clang/include/clang/Basic/DiagnosticOptions.def
+++ b/clang/include/clang/Basic/DiagnosticOptions.def
@@ -53,6 +53,7 @@ DIAGOPT(ShowLocation, 1, 1)     /// Show source location 
information.
 DIAGOPT(ShowLevel, 1, 1)        /// Show diagnostic level.
 DIAGOPT(AbsolutePath, 1, 0)     /// Use absolute paths.
 DIAGOPT(ShowCarets, 1, 1)       /// Show carets in diagnostics.
+DIAGOPT(ShowNoteSnippets, 1, 1) /// Show source snippets for notes.
 DIAGOPT(ShowFixits, 1, 1)       /// Show fixit information.
 DIAGOPT(ShowSourceRanges, 1, 0) /// Show source ranges in numeric form.
 DIAGOPT(ShowParseableFixits, 1, 0) /// Show machine parseable fix-its.
diff --git a/clang/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index 6af0f578b6d63..9f1757419acd2 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -2326,6 +2326,12 @@ def fdiagnostics_misexpect_tolerance_EQ : Joined<["-"], 
"fdiagnostics-misexpect-
     Group<f_Group>, Visibility<[ClangOption, CC1Option]>,
     MetaVarName<"<value>">,
     HelpText<"Prevent misexpect diagnostics from being output if the profile 
counts are within N% of the expected. ">;
+defm diagnostics_show_note_snippets : 
BoolFOption<"diagnostics-show-note-snippets",
+    DiagnosticOpts<"ShowNoteSnippets">, DefaultTrue,
+    NegFlag<SetFalse, [], [ClangOption, CC1Option],
+            "Do not show source line and caret snippets for notes">,
+    PosFlag<SetTrue, [], [ClangOption],
+            "Show source line and caret snippets for notes (default)">>;
 defm diagnostics_show_option : BoolFOption<"diagnostics-show-option",
     DiagnosticOpts<"ShowOptionNames">, DefaultTrue,
     NegFlag<SetFalse, [], [ClangOption, CC1Option]>,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 19d37b2ed7017..86318d084c38f 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -4538,6 +4538,8 @@ static void RenderDiagnosticsOptions(const Driver &D, 
const ArgList &Args,
                     options::OPT_fno_caret_diagnostics, CaretDefault))
     CmdArgs.push_back("-fno-caret-diagnostics");
 
+  Args.addOptOutFlag(CmdArgs, options::OPT_fdiagnostics_show_note_snippets,
+                     options::OPT_fno_diagnostics_show_note_snippets);
   Args.addOptOutFlag(CmdArgs, options::OPT_fdiagnostics_fixit_info,
                      options::OPT_fno_diagnostics_fixit_info);
   Args.addOptOutFlag(CmdArgs, options::OPT_fdiagnostics_show_option,
diff --git a/clang/lib/Frontend/TextDiagnostic.cpp 
b/clang/lib/Frontend/TextDiagnostic.cpp
index 5221ed4de02ff..3e7ccccfec5e2 100644
--- a/clang/lib/Frontend/TextDiagnostic.cpp
+++ b/clang/lib/Frontend/TextDiagnostic.cpp
@@ -1368,6 +1368,10 @@ void TextDiagnostic::emitSnippetAndCaret(
   // multiple times if one loc has multiple diagnostics.
   if (!DiagOpts.ShowCarets)
     return;
+  if (Level == DiagnosticsEngine::Note && !DiagOpts.ShowNoteSnippets) {
+    emitParseableFixits(Hints, Loc.getManager());
+    return;
+  }
   if (Loc == LastLoc && Ranges.empty() && Hints.empty() &&
       (LastLevel != DiagnosticsEngine::Note || Level == LastLevel))
     return;
diff --git a/clang/test/Driver/fdiagnostics-show-note-snippets.c 
b/clang/test/Driver/fdiagnostics-show-note-snippets.c
new file mode 100644
index 0000000000000..05b704b8f6f83
--- /dev/null
+++ b/clang/test/Driver/fdiagnostics-show-note-snippets.c
@@ -0,0 +1,11 @@
+// Default: nothing is passed to cc1.
+// RUN: %clang -### -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix=DEFAULT
+// DEFAULT-NOT: "-fno-diagnostics-show-note-snippets"
+// DEFAULT-NOT: "-fdiagnostics-show-note-snippets"
+
+// RUN: %clang -### -fsyntax-only -fno-diagnostics-show-note-snippets %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=DISABLED
+// DISABLED: "-fno-diagnostics-show-note-snippets"
+
+// RUN: %clang -### -fsyntax-only -fno-diagnostics-show-note-snippets \
+// RUN:   -fdiagnostics-show-note-snippets %s 2>&1 | FileCheck %s 
--check-prefix=DEFAULT
diff --git a/clang/test/Misc/diag-note-snippets.cpp 
b/clang/test/Misc/diag-note-snippets.cpp
new file mode 100644
index 0000000000000..b7495bffbcec4
--- /dev/null
+++ b/clang/test/Misc/diag-note-snippets.cpp
@@ -0,0 +1,41 @@
+// By default, both the error and the note show a snippet.
+// RUN: not %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck %s 
--check-prefix=SNIPPET
+// SNIPPET: error: redefinition of 'x'
+// SNIPPET-NEXT: {{[0-9]+}} | float x;
+// SNIPPET-NEXT: | {{.*}}^
+// SNIPPET-NEXT: note: previous definition is here
+// SNIPPET-NEXT: {{[0-9]+}} | int x;
+// SNIPPET-NEXT: | {{.*}}^
+
+// With -fno-diagnostics-show-note-snippets, the error keeps its snippet but 
the
+// note only shows its message line.
+// RUN: not %clang_cc1 -fsyntax-only -fno-diagnostics-show-note-snippets %s 
2>&1 | FileCheck %s --check-prefix=NOSNIPPET
+// NOSNIPPET: error: redefinition of 'x'
+// NOSNIPPET-NEXT: {{[0-9]+}} | float x;
+// NOSNIPPET-NEXT: | {{.*}}^
+// NOSNIPPET-NEXT: note: previous definition is here
+// NOSNIPPET-NOT: int x;
+// NOSNIPPET: error: no matching function for call to 'f'
+// NOSNIPPET-NEXT: {{[0-9]+}} | f();
+// NOSNIPPET-NEXT: | ^
+// NOSNIPPET-NEXT: note: candidate function not viable
+// NOSNIPPET-NOT: void f(int);
+
+
+// With -fno-diagnostics-show-note-snippets, parseable fixits on notes are 
still
+// emitted.
+// RUN: not %clang_cc1 -fsyntax-only -fno-diagnostics-show-note-snippets 
-fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s --check-prefix=FIXIT
+// FIXIT: warning: using the result of an assignment
+// FIXIT: note: place parentheses around the assignment
+// FIXIT-NEXT: fix-it:{{.*}}diag-note-snippets.cpp
+
+int x;
+float x;
+
+void f(int);
+
+void g(int a) {
+  f();
+  if (a = 5) {
+  }
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/216250
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to