diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2008-08-05 19:40:20 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2008-08-05 19:40:20 +0000 |
commit | db82568300e710b7646a4a0e26c12f61d3750dde (patch) | |
tree | 3de7d02756033b8322aa17e85c1c72f59276ea46 | |
parent | 815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889 (diff) |
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
-rw-r--r-- | Driver/TextDiagnosticPrinter.cpp | 13 | ||||
-rw-r--r-- | test/Sema/text-diag.c | 4 |
2 files changed, 12 insertions, 5 deletions
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"; |