tbaeder created this revision. tbaeder added reviewers: cjdb, aaron.ballman. Herald added a project: All. tbaeder requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
The first line of the code snippet we print is potentially lower than the caret line, so handle that case. Fixes https://github.com/llvm/llvm-project/issues/63524 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D153849 Files: clang/lib/Frontend/TextDiagnostic.cpp clang/test/Misc/diag-style.cpp Index: clang/test/Misc/diag-style.cpp =================================================================== --- clang/test/Misc/diag-style.cpp +++ clang/test/Misc/diag-style.cpp @@ -10,3 +10,17 @@ // 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 | Index: clang/lib/Frontend/TextDiagnostic.cpp =================================================================== --- clang/lib/Frontend/TextDiagnostic.cpp +++ clang/lib/Frontend/TextDiagnostic.cpp @@ -1160,16 +1160,20 @@ // 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))
Index: clang/test/Misc/diag-style.cpp =================================================================== --- clang/test/Misc/diag-style.cpp +++ clang/test/Misc/diag-style.cpp @@ -10,3 +10,17 @@ // 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 | Index: clang/lib/Frontend/TextDiagnostic.cpp =================================================================== --- clang/lib/Frontend/TextDiagnostic.cpp +++ clang/lib/Frontend/TextDiagnostic.cpp @@ -1160,16 +1160,20 @@ // 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))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits