From 9b1e854698d036cae6ab1d6576f709bec6fce082 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Fri, 11 Jan 2013 02:37:55 +0000 Subject: [PATCH] SMDiagnostic: don't emit ranges if there are /any/ multibyte characters. Right now, only OS X has a way to determine the column width of a string (PR14910). Until we have a good way to deal with this, we just won't print carets, source ranges, or fixits for SMDiagnostic if the source line has multibyte characters in it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172164 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/SourceMgr.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/Support/SourceMgr.cpp b/lib/Support/SourceMgr.cpp index 58a7713b4d1..fa82265f380 100644 --- a/lib/Support/SourceMgr.cpp +++ b/lib/Support/SourceMgr.cpp @@ -336,6 +336,10 @@ static void printSourceLine(raw_ostream &S, StringRef LineContents) { S << '\n'; } +static bool isNonASCII(char c) { + return c & 0x80; +} + void SMDiagnostic::print(const char *ProgName, raw_ostream &S, bool ShowColors) const { // Display colors only if OS supports colors. @@ -392,18 +396,17 @@ void SMDiagnostic::print(const char *ProgName, raw_ostream &S, if (LineNo == -1 || ColumnNo == -1) return; - // FIXME: If there are multibyte characters in the source, all our ranges will - // be wrong. To do this properly, we'll need a byte-to-column map like Clang's - // TextDiagnostic. For now, we'll just handle tabs by expanding them later, - // and bail out rather than show incorrect ranges and misaligned fixits for - // any other odd characters. - SmallString<128> PrintableLine(LineContents); - std::replace(PrintableLine.begin(), PrintableLine.end(), '\t', ' '); - size_t NumColumns = (size_t)llvm::sys::locale::columnWidth(PrintableLine); - if (NumColumns != PrintableLine.size()) { + // FIXME: If there are multibyte or multi-column characters in the source, all + // our ranges will be wrong. To do this properly, we'll need a byte-to-column + // map like Clang's TextDiagnostic. For now, we'll just handle tabs by + // expanding them later, and bail out rather than show incorrect ranges and + // misaligned fixits for any other odd characters. + if (std::find_if(LineContents.begin(), LineContents.end(), isNonASCII) != + LineContents.end()) { printSourceLine(S, LineContents); return; } + size_t NumColumns = LineContents.size(); // Build the line with the caret and ranges. std::string CaretLine(NumColumns+1, ' '); -- 2.11.0