From: Chris Lattner Date: Fri, 13 Jul 2007 23:58:20 +0000 (+0000) Subject: Improve char literal pretty printing, patch by Keith Bauer! X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8bf9f079f11997df432b0b711be97b72cc497ffa;p=clang Improve char literal pretty printing, patch by Keith Bauer! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@39846 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/StmtPrinter.cpp b/AST/StmtPrinter.cpp index 7832c74ae8..a88399657b 100644 --- a/AST/StmtPrinter.cpp +++ b/AST/StmtPrinter.cpp @@ -292,13 +292,50 @@ void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { } void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) { + // FIXME should print an L for wchar_t constants unsigned value = Node->getValue(); - if (isprint(value)) { - OS << "'" << (char)value << "'"; - } else { - // FIXME something to indicate this is a character literal? - OS << std::hex << std::setiosflags(std::ios_base::showbase) << value - << std::dec << std::resetiosflags(std::ios_base::showbase); + switch (value) { + case '\\': + OS << "'\\\\'"; + break; + case '\'': + OS << "'\\''"; + break; + case '\a': + // TODO: K&R: the meaning of '\\a' is different in traditional C + OS << "'\\a'"; + break; + case '\b': + OS << "'\\b'"; + break; + // Nonstandard escape sequence. + /*case '\e': + OS << "'\\e'"; + break;*/ + case '\f': + OS << "'\\f'"; + break; + case '\n': + OS << "'\\n'"; + break; + case '\r': + OS << "'\\r'"; + break; + case '\t': + OS << "'\\t'"; + break; + case '\v': + OS << "'\\v'"; + break; + default: + if (isprint(value) && value < 256) { + OS << "'" << (char)value << "'"; + } else if (value < 256) { + OS << "'\\x" << std::hex << value << std::dec << "'"; + } else { + // FIXME what to really do here? + OS << value; + } } } diff --git a/test/Parser/char-literal-printing.c b/test/Parser/char-literal-printing.c new file mode 100644 index 0000000000..d6a2f90b21 --- /dev/null +++ b/test/Parser/char-literal-printing.c @@ -0,0 +1,31 @@ +// RUN: clang -parse-ast-print %s 2>&1 | clang -parse-ast-print + +#include + +char test1(void) { return '\\'; } +wchar_t test2(void) { return L'\\'; } +char test3(void) { return '\''; } +wchar_t test4(void) { return L'\''; } +char test5(void) { return '\a'; } +wchar_t test6(void) { return L'\a'; } +char test7(void) { return '\b'; } +wchar_t test8(void) { return L'\b'; } +char test9(void) { return '\e'; } +wchar_t test10(void) { return L'\e'; } +char test11(void) { return '\f'; } +wchar_t test12(void) { return L'\f'; } +char test13(void) { return '\n'; } +wchar_t test14(void) { return L'\n'; } +char test15(void) { return '\r'; } +wchar_t test16(void) { return L'\r'; } +char test17(void) { return '\t'; } +wchar_t test18(void) { return L'\t'; } +char test19(void) { return '\v'; } +wchar_t test20(void) { return L'\v'; } + +char test21(void) { return 'c'; } +wchar_t test22(void) { return L'c'; } +char test23(void) { return '\x3'; } +wchar_t test24(void) { return L'\x3'; } + +wchar_t test25(void) { return L'\x333'; }