From: Nuno Lopes Date: Tue, 5 Aug 2008 19:40:20 +0000 (+0000) Subject: fix crash when printing diagnostics with tokens that span through more than one line X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=db82568300e710b7646a4a0e26c12f61d3750dde;p=clang fix crash when printing diagnostics with tokens that span through more than one line git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54365 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/TextDiagnosticPrinter.cpp b/Driver/TextDiagnosticPrinter.cpp index 5d06ebea2d..16c7645862 100644 --- a/Driver/TextDiagnosticPrinter.cpp +++ b/Driver/TextDiagnosticPrinter.cpp @@ -49,7 +49,7 @@ void TextDiagnosticPrinter::HighlightRange(const SourceRange &R, SourceManager& SourceMgr, unsigned LineNo, unsigned FileID, std::string &CaratLine, - const std::string &SourceLine) { + const std::string &SourceLine) { assert(CaratLine.size() == SourceLine.size() && "Expect a correspondence between source and carat line!"); if (!R.isValid()) return; @@ -91,13 +91,16 @@ void TextDiagnosticPrinter::HighlightRange(const SourceRange &R, } // Pick the last non-whitespace column. - while (EndColNo-1 && - (SourceLine[EndColNo-1] == ' ' || SourceLine[EndColNo-1] == '\t')) - --EndColNo; + if (EndColNo <= SourceLine.size()) + while (EndColNo-1 && + (SourceLine[EndColNo-1] == ' ' || SourceLine[EndColNo-1] == '\t')) + --EndColNo; + else + EndColNo = SourceLine.size(); // Fill the range with ~'s. assert(StartColNo <= EndColNo && "Invalid range!"); - for (unsigned i = StartColNo; i != EndColNo; ++i) + for (unsigned i = StartColNo; i < EndColNo; ++i) CaratLine[i] = '~'; } diff --git a/test/Sema/text-diag.c b/test/Sema/text-diag.c new file mode 100644 index 0000000000..2e31291844 --- /dev/null +++ b/test/Sema/text-diag.c @@ -0,0 +1,4 @@ +// RUN: clang -fsyntax-only %s +unsigned char *foo = "texto\ +que continua\ +e continua";