Index: cfe/trunk/include/clang/Basic/JsonSupport.h =================================================================== --- cfe/trunk/include/clang/Basic/JsonSupport.h +++ cfe/trunk/include/clang/Basic/JsonSupport.h @@ -31,7 +31,26 @@ std::string Str = RawSR.trim().str(); size_t Pos = 0; + // Escape backslashes. + while (true) { + Pos = Str.find('\\', Pos); + if (Pos == std::string::npos) + break; + + // Prevent bad conversions. + size_t TempPos = (Pos != 0) ? Pos - 1 : 0; + + // See whether the current backslash is not escaped. + if (TempPos != Str.find("\\\\", Pos)) { + Str.insert(Pos, "\\"); + ++Pos; // As we insert the backslash move plus one. + } + + ++Pos; + } + // Escape double quotes. + Pos = 0; while (true) { Pos = Str.find('\"', Pos); if (Pos == std::string::npos) @@ -40,8 +59,8 @@ // Prevent bad conversions. size_t TempPos = (Pos != 0) ? Pos - 1 : 0; - // See whether the current double quote is escaped. - if (TempPos != Str.find("\\\"", TempPos)) { + // See whether the current double quote is not escaped. + if (TempPos != Str.find("\\\"", Pos)) { Str.insert(Pos, "\\"); ++Pos; // As we insert the escape-character move plus one. } Index: cfe/trunk/test/Analysis/dump_egraph.c =================================================================== --- cfe/trunk/test/Analysis/dump_egraph.c +++ cfe/trunk/test/Analysis/dump_egraph.c @@ -13,6 +13,8 @@ int foo() { int *x = 0, *y = 0; + char c = '\x13'; + return *x + *y; } @@ -22,5 +24,7 @@ // CHECK: \"has_report\": true -// CHECK: \"pretty\": \"*x\", \"location\": \{ \"line\": 16, \"column\": 10, \"file\": \"{{(.+)}}dump_egraph.c\" \} +// CHECK: \"pretty\": \"*x\", \"location\": \{ \"line\": 18, \"column\": 10, \"file\": \"{{(.+)}}dump_egraph.c\" \} + +// CHECK: \"pretty\": \"'\\\\x13'\" Index: cfe/trunk/test/Analysis/exploded-graph-rewriter/escapes.c =================================================================== --- cfe/trunk/test/Analysis/exploded-graph-rewriter/escapes.c +++ cfe/trunk/test/Analysis/exploded-graph-rewriter/escapes.c @@ -15,7 +15,7 @@ // CHECK: Environment: // CHECK-SAME: "foo" // CHECK-SAME: &Element\{"foo",0 S64b,char\} - const char *const foo = "foo"; + const char *const foo = "\x66\x6f\x6f"; // CHECK: BinaryOperator // CHECK-SAME: 1 \| 2