diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -8722,12 +8722,14 @@ // "unsigned char" on systems where "char" is unsigned. if (lhptee->isCharType()) ltrans = S.Context.UnsignedCharTy; - else if (lhptee->hasSignedIntegerRepresentation()) + else if (!lhptee->isWideCharType() && + lhptee->hasSignedIntegerRepresentation()) ltrans = S.Context.getCorrespondingUnsignedType(ltrans); if (rhptee->isCharType()) rtrans = S.Context.UnsignedCharTy; - else if (rhptee->hasSignedIntegerRepresentation()) + else if (!rhptee->isWideCharType() && + rhptee->hasSignedIntegerRepresentation()) rtrans = S.Context.getCorrespondingUnsignedType(rtrans); if (ltrans == rtrans) { diff --git a/clang/test/SemaCXX/wchar_t.cpp b/clang/test/SemaCXX/wchar_t.cpp --- a/clang/test/SemaCXX/wchar_t.cpp +++ b/clang/test/SemaCXX/wchar_t.cpp @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -// RUN: %clang_cc1 -fsyntax-only -Wno-signed-unsigned-wchar -verify=allow-signed %s +// RUN: %clang_cc1 -fsyntax-only -Wno-signed-unsigned-wchar -verify=allow-signed -DSKIP_ERROR_TESTS %s // allow-signed-no-diagnostics wchar_t x; @@ -32,3 +32,10 @@ // rdar://8040728 wchar_t in[] = L"\x434" "\x434"; // No warning +#ifndef SKIP_ERROR_TESTS +// Verify that we do not crash when assigning wchar_t* to another pointer type. +void assignment(wchar_t *x) { + char *y; + y = x; // expected-error {{incompatible pointer types assigning to 'char *' from 'wchar_t *'}} +} +#endif