[PATCH] D91625: [clang] Do not crash on pointer wchar_t pointer assignment.
Adam Czachorowski via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 17 05:27:37 PST 2020
adamcz created this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
adamcz requested review of this revision.
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.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D91625
Files:
clang/lib/Sema/SemaExpr.cpp
clang/test/SemaCXX/wchar_t.cpp
Index: clang/test/SemaCXX/wchar_t.cpp
===================================================================
--- clang/test/SemaCXX/wchar_t.cpp
+++ 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
Index: clang/lib/Sema/SemaExpr.cpp
===================================================================
--- clang/lib/Sema/SemaExpr.cpp
+++ 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) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D91625.305751.patch
Type: text/x-patch
Size: 1689 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201117/cf6d8352/attachment.bin>
More information about the cfe-commits
mailing list