Author: Adam Czachorowski Date: 2020-11-20T15:27:15+01:00 New Revision: 95ce9fbc235a467b84b2ffa2571f1d1a45af9427
URL: https://github.com/llvm/llvm-project/commit/95ce9fbc235a467b84b2ffa2571f1d1a45af9427 DIFF: https://github.com/llvm/llvm-project/commit/95ce9fbc235a467b84b2ffa2571f1d1a45af9427.diff LOG: [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 Added: Modified: clang/lib/AST/ASTContext.cpp clang/test/SemaCXX/wchar_t.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 836065291fea..f54916babed7 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -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; diff --git a/clang/test/SemaCXX/wchar_t.cpp b/clang/test/SemaCXX/wchar_t.cpp index f8e9addf27b7..cc7c6de7b37f 100644 --- 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 @@ 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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits