forked from OSchip/llvm-project
[clang] Do not crash on pointer wchar_t pointer assignment.
wchar_t can be signed (thus hasSignedIntegerRepresentation() returns true), but it doesn't have an unsigned type, which would lead to a crash when trying to get it. With this fix, we special-case WideChar types in the pointer assignment code. Differential Revision: https://reviews.llvm.org/D91625
This commit is contained in:
parent
412237dcd0
commit
95ce9fbc23
|
@ -10007,6 +10007,11 @@ QualType ASTContext::getCorrespondingUnsignedType(QualType T) const {
|
|||
return UnsignedLongLongTy;
|
||||
case BuiltinType::Int128:
|
||||
return UnsignedInt128Ty;
|
||||
// wchar_t is special. It is either signed or not, but when it's signed,
|
||||
// there's no matching "unsigned wchar_t". Therefore we return the unsigned
|
||||
// version of it's underlying type instead.
|
||||
case BuiltinType::WChar_S:
|
||||
return getUnsignedWCharType();
|
||||
|
||||
case BuiltinType::ShortAccum:
|
||||
return UnsignedShortAccumTy;
|
||||
|
|
|
@ -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 @@ int t(void) {
|
|||
// 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
|
||||
|
|
Loading…
Reference in New Issue