[PATCH] D107021: [Sema][ObjC] Allow conversions between pointers to ObjC pointers and pointers to structs
Akira Hatanaka via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 24 10:32:18 PDT 2021
ahatanak updated this revision to Diff 368391.
ahatanak added a comment.
Rebase and ping.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D107021/new/
https://reviews.llvm.org/D107021
Files:
clang/lib/Sema/SemaExprObjC.cpp
clang/test/SemaObjC/arc-type-conversion.m
Index: clang/test/SemaObjC/arc-type-conversion.m
===================================================================
--- clang/test/SemaObjC/arc-type-conversion.m
+++ clang/test/SemaObjC/arc-type-conversion.m
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -fobjc-arc -fobjc-runtime-has-weak -verify -fblocks %s
+// RUN: %clang_cc1 -fsyntax-only -fobjc-arc -fobjc-runtime-has-weak -verify -fblocks -Wno-incompatible-pointer-types %s
typedef const void * CFTypeRef;
CFTypeRef CFBridgingRetain(id X);
@@ -96,3 +96,14 @@
id c = 1 ? a : b; // expected-error {{operands to conditional of types 'id' and 'void *' are incompatible in ARC mode}}
id d = 1 ? b : a; // expected-error {{operands to conditional of types 'void *' and 'id' are incompatible in ARC mode}}
}
+
+void conversion_pointer_to_id(__strong id *x) {
+ struct S {
+ int a[2];
+ } s, *p;
+
+ x = (__strong id *)&s;
+ x = &s; // expected-error {{implicit conversion of a non-Objective-C pointer type 'struct S *' to '__strong id *' is disallowed with ARC}}
+ p = (struct S *)x;
+ p = x; // expected-error {{implicit conversion of an indirect pointer to an Objective-C pointer to 'struct S *' is disallowed with ARC}}
+}
Index: clang/lib/Sema/SemaExprObjC.cpp
===================================================================
--- clang/lib/Sema/SemaExprObjC.cpp
+++ clang/lib/Sema/SemaExprObjC.cpp
@@ -4450,9 +4450,14 @@
// Allow casts between pointers to lifetime types (e.g., __strong id*)
// and pointers to void (e.g., cv void *). Casting from void* to lifetime*
// must be explicit.
- if (exprACTC == ACTC_indirectRetainable && castACTC == ACTC_voidPtr)
+ // Allow conversions between pointers to lifetime types and coreFoundation
+ // pointers too, but only when the conversions are explicit.
+ if (exprACTC == ACTC_indirectRetainable &&
+ (castACTC == ACTC_voidPtr ||
+ (castACTC == ACTC_coreFoundation && isCast(CCK))))
return ACR_okay;
- if (castACTC == ACTC_indirectRetainable && exprACTC == ACTC_voidPtr &&
+ if (castACTC == ACTC_indirectRetainable &&
+ (exprACTC == ACTC_voidPtr || exprACTC == ACTC_coreFoundation) &&
isCast(CCK))
return ACR_okay;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107021.368391.patch
Type: text/x-patch
Size: 2191 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210824/c325c8ae/attachment.bin>
More information about the cfe-commits
mailing list