diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp index 48082d7273e51..3a3cc246d3afc 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 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 b12afb2cd9238..3b24df974730a 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 |