diff options
-rw-r--r-- | AST/StmtPrinter.cpp | 49 | ||||
-rw-r--r-- | test/Parser/char-literal-printing.c | 31 |
2 files changed, 74 insertions, 6 deletions
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 <stddef.h> + +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'; } |