diff options
-rw-r--r-- | clang/Driver/TextDiagnosticPrinter.cpp | 13 | ||||
-rw-r--r-- | clang/test/Sema/text-diag.c | 4 |
2 files changed, 12 insertions, 5 deletions
diff --git a/clang/Driver/TextDiagnosticPrinter.cpp b/clang/Driver/TextDiagnosticPrinter.cpp index 5d06ebea2d1..16c7645862d 100644 --- a/clang/Driver/TextDiagnosticPrinter.cpp +++ b/clang/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/clang/test/Sema/text-diag.c b/clang/test/Sema/text-diag.c new file mode 100644 index 00000000000..2e312918442 --- /dev/null +++ b/clang/test/Sema/text-diag.c @@ -0,0 +1,4 @@ +// RUN: clang -fsyntax-only %s +unsigned char *foo = "texto\ +que continua\ +e continua"; |