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,19 @@ } 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 wchar_t *temp = + reinterpret_cast(String->getBytes().data()); + std::wstring wstr(temp); + std::string str; + if (!convertWideToUTF8(wstr.substr(0, wsize), 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,12 @@ return 0; } + // CHECK: CXXMethodDecl: :bar(const wchar_t *() + const wchar_t *bar() { + // CHECK: StringLiteral: bar( + return L"bar"; + } + // CHECK: AccessSpecDecl: public( public: int not_initialized;