Author: Timm Bäder Date: 2023-06-30T10:57:10+02:00 New Revision: 8554a55d041f2c7de329adda538cadf7eeb6e8a8
URL: https://github.com/llvm/llvm-project/commit/8554a55d041f2c7de329adda538cadf7eeb6e8a8 DIFF: https://github.com/llvm/llvm-project/commit/8554a55d041f2c7de329adda538cadf7eeb6e8a8.diff LOG: [clang][Diagnostics] Fix diagnostic line numbers The first line of the code snippet we print is potentially lower than the caret line, so handle that case. Fixes #63524 Differential Revision: https://reviews.llvm.org/D153849 Added: Modified: clang/lib/Frontend/TextDiagnostic.cpp clang/test/Misc/diag-style.cpp Removed: ################################################################################ diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp index 48082d7273e51b..3a3cc246d3afc2 100644 --- a/clang/lib/Frontend/TextDiagnostic.cpp +++ b/clang/lib/Frontend/TextDiagnostic.cpp @@ -1160,16 +1160,20 @@ void TextDiagnostic::emitSnippetAndCaret( // Find the set of lines to include. const unsigned MaxLines = DiagOpts->SnippetLineLimit; std::pair<unsigned, unsigned> Lines = {CaretLineNo, CaretLineNo}; + unsigned DisplayLineNo = + Ranges.empty() ? Loc.getPresumedLoc().getLine() : ~0u; for (const auto &I : Ranges) { if (auto OptionalRange = findLinesForRange(I, FID, SM)) Lines = maybeAddRange(Lines, *OptionalRange, MaxLines); + + DisplayLineNo = + std::min(DisplayLineNo, SM.getPresumedLineNumber(I.getBegin())); } // Our line numbers look like: // " [number] | " // Where [number] is MaxLineNoDisplayWidth columns // and the full thing is therefore MaxLineNoDisplayWidth + 4 columns. - unsigned DisplayLineNo = Loc.getPresumedLoc().getLine(); unsigned MaxLineNoDisplayWidth = DiagOpts->ShowLineNumbers ? std::max(4u, getNumDisplayWidth(DisplayLineNo + MaxLines)) diff --git a/clang/test/Misc/diag-style.cpp b/clang/test/Misc/diag-style.cpp index b12afb2cd9238a..3b24df974730a8 100644 --- a/clang/test/Misc/diag-style.cpp +++ b/clang/test/Misc/diag-style.cpp @@ -10,3 +10,17 @@ static_assert(false && // CHECK-NEXT: {{^}} 5 | {{$}} // CHECK-NEXT: {{^}} 6 | true, "");{{$}} // CHECK-NEXT: {{^}} | ~~~~{{$}} + + +/// #line pragmas are respected +void printf(const char *a, ...) __attribute__((__format__(__printf__, 1, 2))); +#line 10 +void f(int x) { + printf("%f", + x); +} +// CHECK: 12:10: warning: format specifies type +// CHECK-NEXT: {{^}} 11 | +// CHECK-NEXT: {{^}} | +// CHECK-NEXT: {{^}} | +// CHECK-NEXT: {{^}} 12 | _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits