diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-12-30 23:37:31 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-12-30 23:37:31 +0000 |
commit | 88eb4d3a456ab64507af790ac774eec2f0af6806 (patch) | |
tree | 357eb29441f9a7a5c6dfad1552738d779794498f /clang/lib/AST/StmtPrinter.cpp | |
parent | fddd384b7368b7b22719d5ab848837488810ccbe (diff) | |
download | bcm5719-llvm-88eb4d3a456ab64507af790ac774eec2f0af6806.tar.gz bcm5719-llvm-88eb4d3a456ab64507af790ac774eec2f0af6806.zip |
Fix crash when trying to pretty-print unicode or wide string literals.
llvm-svn: 147385
Diffstat (limited to 'clang/lib/AST/StmtPrinter.cpp')
-rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index 6d9139c000a..6408c879fa2 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -710,16 +710,27 @@ void StmtPrinter::VisitStringLiteral(StringLiteral *Str) { case StringLiteral::UTF32: OS << 'U'; break; } OS << '"'; + static char Hex[] = "0123456789ABCDEF"; - // FIXME: this doesn't print wstrings right. - StringRef StrData = Str->getString(); - for (StringRef::iterator I = StrData.begin(), E = StrData.end(); - I != E; ++I) { - unsigned char Char = *I; - - switch (Char) { + for (unsigned I = 0, N = Str->getLength(); I != N; ++I) { + switch (uint32_t Char = Str->getCodeUnit(I)) { default: - if (isprint(Char)) + // FIXME: Is this the best way to print wchar_t? + if (Char > 0xff) { + // char32_t values are <= 0x10ffff. + if (Char > 0xffff) + OS << "\\U00" + << Hex[(Char >> 20) & 15] + << Hex[(Char >> 16) & 15]; + else + OS << "\\u"; + OS << Hex[(Char >> 12) & 15] + << Hex[(Char >> 8) & 15] + << Hex[(Char >> 4) & 15] + << Hex[(Char >> 0) & 15]; + break; + } + if (Char <= 0xff && isprint(Char)) OS << (char)Char; else // Output anything hard as an octal escape. OS << '\\' |