Index: clang/lib/Tooling/ASTDiff/ASTDiff.cpp =================================================================== --- clang/lib/Tooling/ASTDiff/ASTDiff.cpp +++ clang/lib/Tooling/ASTDiff/ASTDiff.cpp @@ -16,6 +16,7 @@ #include "clang/Basic/SourceManager.h" #include "clang/Lex/Lexer.h" #include "llvm/ADT/PriorityQueue.h" +#include "llvm/Support/ConvertUTF.h" #include #include @@ -463,8 +464,39 @@ } if (auto *D = dyn_cast(S)) return getRelativeName(D->getDecl(), getEnclosingDeclContext(AST, S)); - if (auto *String = dyn_cast(S)) + if (auto *String = dyn_cast(S)) { + if (String->isWide()) { + unsigned int wsize = String->getByteLength() / String->getCharByteWidth(); + const auto *temp = + reinterpret_cast(String->getBytes().data()); + std::wstring wstr(temp, wsize); + std::string str; + if (!convertWideToUTF8(wstr, str)) + return ""; + return str; + } + if (String->isUTF16()) { + unsigned int usize = String->getByteLength() / String->getCharByteWidth(); + const auto *temp = + reinterpret_cast(String->getBytes().data()); + ArrayRef u16str(temp, usize); + std::string str; + if (!convertUTF16ToUTF8String(u16str, str)) + return ""; + return str; + } + if (String->isUTF32()) { + unsigned int usize = String->getByteLength() / String->getCharByteWidth(); + const auto *temp = + reinterpret_cast(String->getBytes().data()); + ArrayRef u32str(temp, usize); + std::string str; + if (!convertUTF32ToUTF8String(u32str, str)) + return ""; + return str; + } return std::string(String->getString()); + } if (auto *B = dyn_cast(S)) return B->getValue() ? "true" : "false"; return ""; Index: clang/test/Tooling/clang-diff-ast.cpp =================================================================== --- clang/test/Tooling/clang-diff-ast.cpp +++ clang/test/Tooling/clang-diff-ast.cpp @@ -51,6 +51,30 @@ return 0; } + const wchar_t *fooWide(int i) { + if (i == 0) + // CHECK: StringLiteral: foo( + return L"foo"; + // CHECK-NOT: ImplicitCastExpr + return 0; + } + + const char16_t *fooU16(int i) { + if (i == 0) + // CHECK: StringLiteral: foo( + return u"foo"; + // CHECK-NOT: ImplicitCastExpr + return 0; + } + + const char32_t *fooU32(int i) { + if (i == 0) + // CHECK: StringLiteral: foo( + return U"foo"; + // CHECK-NOT: ImplicitCastExpr + return 0; + } + // CHECK: AccessSpecDecl: public( public: int not_initialized;