================
@@ -192,47 +192,71 @@ struct MarkerStyle {
std::string Note;
/// Does this marker indicate inclusion by -dump-input-filter=error?
bool FiltersAsError;
- MarkerStyle() = default;
- MarkerStyle(char Lead, raw_ostream::Colors Color,
- const std::string &Note = "", bool FiltersAsError = false)
- : Lead(Lead), Color(Color), Note(Note), FiltersAsError(FiltersAsError) {
- assert((!FiltersAsError || !Note.empty()) &&
- "expected error diagnostic to have note");
- }
};
-static MarkerStyle GetMarker(FileCheckDiag::MatchType MatchTy) {
- switch (MatchTy) {
- case FileCheckDiag::MatchFoundAndExpected:
- return MarkerStyle('^', raw_ostream::GREEN);
- case FileCheckDiag::MatchFoundButExcluded:
- return MarkerStyle('!', raw_ostream::RED, "error: no match expected",
- /*FiltersAsError=*/true);
- case FileCheckDiag::MatchFoundButWrongLine:
- return MarkerStyle('!', raw_ostream::RED, "error: match on wrong line",
- /*FiltersAsError=*/true);
- case FileCheckDiag::MatchFoundButDiscarded:
- return MarkerStyle('!', raw_ostream::CYAN,
- "discard: overlaps earlier match");
- case FileCheckDiag::MatchFoundErrorNote:
- // Note should always be overridden within the FileCheckDiag.
- return MarkerStyle('!', raw_ostream::RED,
- "error: unknown error after match",
- /*FiltersAsError=*/true);
- case FileCheckDiag::MatchNoneAndExcluded:
- return MarkerStyle('X', raw_ostream::GREEN);
- case FileCheckDiag::MatchNoneButExpected:
- return MarkerStyle('X', raw_ostream::RED, "error: no match found",
- /*FiltersAsError=*/true);
- case FileCheckDiag::MatchNoneForInvalidPattern:
- return MarkerStyle('X', raw_ostream::RED,
- "error: match failed for invalid pattern",
- /*FiltersAsError=*/true);
- case FileCheckDiag::MatchFuzzy:
- return MarkerStyle('?', raw_ostream::MAGENTA, "possible intended match",
- /*FiltersAsError=*/true);
+static MarkerStyle getMarker(const FileCheckDiag &Diag) {
+ // By default, the marker is based on whether the diagnostic is an error or
is
+ // a MatchNoteDiag on a MatchResultDiag that is an error.
+ //
+ // It's less confusing if diagnostics that don't actually have match ranges
+ // don't have markers. For example, a marker for the MatchNoteDiag
+ // 'with "VAR" equal to "5"' would seem to indicate where "VAR" matches, but
+ // we don't actually have that location. Instead, we just place the note
+ // after the start of the associated MatchResultDiag. This decision is
+ // overriden below for the case of MatchNoneDiag because the search range is
+ // used instead.
+ MarkerStyle Res;
+ bool IsError = Diag.isError() || Diag.getMatchResultDiag().isError();
+ Res.Lead = !Diag.getMatchRange() ? ' ' : IsError ? '!' : '^';
+ Res.Color = IsError ? raw_ostream::RED : raw_ostream::GREEN;
+ Res.FiltersAsError = IsError;
+
+ // Add Note. Override the default Lead and Color for some diagnostic kinds.
+ switch (Diag.getKind()) {
+ case FileCheckDiag::FCDK_MatchFoundDiag:
+ switch (cast<MatchFoundDiag>(Diag).getStatus()) {
+ case MatchFoundDiag::Success:
+ break;
+ case MatchFoundDiag::Excluded:
+ Res.Note = "no match expected";
+ break;
+ case MatchFoundDiag::WrongLine:
+ Res.Note = "match on wrong line";
+ break;
+ case MatchFoundDiag::Discarded:
+ Res.Lead = '!'; // Not an error, but not a successful match either.
+ Res.Color = raw_ostream::CYAN;
+ Res.Note = "discard: overlaps earlier match";
+ break;
+ }
+ break;
+ case FileCheckDiag::FCDK_MatchNoneDiag:
+ Res.Lead = 'X';
+ switch (cast<MatchNoneDiag>(Diag).getStatus()) {
+ case MatchNoneDiag::Success:
+ break;
+ case MatchNoneDiag::InvalidPattern:
+ Res.Note = "match failed for invalid pattern";
+ break;
+ case MatchNoneDiag::Expected:
+ Res.Note = "no match found";
+ break;
+ }
+ break;
+ case FileCheckDiag::FCDK_MatchFuzzyDiag:
+ Res.Lead = '?';
+ Res.Color = raw_ostream::MAGENTA;
+ Res.Note = "possible intended match";
+ break;
+ case FileCheckDiag::FCDK_MatchCustomNoteDiag:
+ Res.Note = cast<MatchCustomNoteDiag>(Diag).getNote();
+ break;
}
- llvm_unreachable_internal("unexpected match type");
+ if (Diag.isError()) {
----------------
MaskRay wrote:
The old code asserts
```
assert((!FiltersAsError || !Note.empty()) &&
"expected error diagnostic to have note");
```
Should this assert Res.FiltersAsError instead?
https://github.com/llvm/llvm-project/pull/195571
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits