From 6d4f73498cf014b002e72368f1c80b6b0a0785f0 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Fri, 8 Feb 2013 22:30:27 +0000 Subject: [PATCH] StmtPrinter: Write large char values using \u or \U. This may not always be valid, but we were previously just emitting them raw. While here, s/isprint/isPrintable/ (using the new CharInfo). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174766 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/StmtPrinter.cpp | 17 +++++++++-------- test/Misc/integer-literal-printing.cpp | 12 ++++++------ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index fb9c70c690..9d95c81450 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -21,7 +21,9 @@ #include "clang/AST/ExprCXX.h" #include "clang/AST/PrettyPrinter.h" #include "clang/AST/StmtVisitor.h" +#include "clang/Basic/CharInfo.h" #include "llvm/ADT/SmallString.h" +#include "llvm/Support/Format.h" using namespace clang; //===----------------------------------------------------------------------===// @@ -710,15 +712,14 @@ void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) { OS << "'\\v'"; break; default: - if (value < 256 && isprint(value)) { + if (value < 256 && isPrintable((unsigned char)value)) OS << "'" << (char)value << "'"; - } else if (value < 256) { - OS << "'\\x"; - OS.write_hex(value) << "'"; - } else { - // FIXME what to really do here? - OS << value; - } + else if (value < 256) + OS << "'\\x" << llvm::format("%02x", value) << "'"; + else if (value <= 0xFFFF) + OS << "'\\u" << llvm::format("%04x", value) << "'"; + else + OS << "'\\U" << llvm::format("%08x", value) << "'"; } } diff --git a/test/Misc/integer-literal-printing.cpp b/test/Misc/integer-literal-printing.cpp index 8b0b1fc7f2..74bd8d09a9 100644 --- a/test/Misc/integer-literal-printing.cpp +++ b/test/Misc/integer-literal-printing.cpp @@ -70,10 +70,10 @@ void Function() { struct Type3 t3; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type3Helper<(boolTy)false>::Ty' (aka 'boolTy')}} - struct Type4 t4; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type4Helper<(charTy)'\x0'>::Ty' (aka 'charTy')}} - struct Type5 t5; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type5Helper<(scharTy)'\x0'>::Ty' (aka 'scharTy')}} - struct Type6 t6; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type6Helper<(ucharTy)'\x0'>::Ty' (aka 'ucharTy')}} - struct Type7 t7; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type7Helper<(wcharTy)L'\x0'>::Ty' (aka 'wcharTy')}} - struct Type8 t8; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type8Helper<(char16Ty)u'\x0'>::Ty' (aka 'char16Ty')}} - struct Type9 t9; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type9Helper<(char32Ty)u'\x0'>::Ty' (aka 'char32Ty')}} + struct Type4 t4; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type4Helper<(charTy)'\x00'>::Ty' (aka 'charTy')}} + struct Type5 t5; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type5Helper<(scharTy)'\x00'>::Ty' (aka 'scharTy')}} + struct Type6 t6; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type6Helper<(ucharTy)'\x00'>::Ty' (aka 'ucharTy')}} + struct Type7 t7; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type7Helper<(wcharTy)L'\x00'>::Ty' (aka 'wcharTy')}} + struct Type8 t8; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type8Helper<(char16Ty)u'\x00'>::Ty' (aka 'char16Ty')}} + struct Type9 t9; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type9Helper<(char32Ty)u'\x00'>::Ty' (aka 'char32Ty')}} } -- 2.40.0