]> granicus.if.org Git - clang/commitdiff
Improve char literal pretty printing, patch by Keith Bauer!
authorChris Lattner <sabre@nondot.org>
Fri, 13 Jul 2007 23:58:20 +0000 (23:58 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Jul 2007 23:58:20 +0000 (23:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@39846 91177308-0d34-0410-b5e6-96231b3b80d8

AST/StmtPrinter.cpp
test/Parser/char-literal-printing.c [new file with mode: 0644]

index 7832c74ae8988f5fd4cc635543598ca8fe476e03..a88399657bdc83fba11cc81bab50798861058a41 100644 (file)
@@ -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 (file)
index 0000000..d6a2f90
--- /dev/null
@@ -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'; }