[PATCH] D99661: [SemaObjC] Fix a -Wbridge-cast false-positive

Erik Pilkington via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 1 12:50:29 PDT 2021


erik.pilkington updated this revision to Diff 334801.
erik.pilkington added a comment.

In D99661#2662601 <https://reviews.llvm.org/D99661#2662601>, @ahatanak wrote:

> Should we try to restore the behavior prior to https://reviews.llvm.org/rG09abecef7bbfda18d34f046954eaa4d491062839 as much as we can? Or that's not important?

Sure, the new patch starts iterating through the redeclarations starting at the most recent declaration, which should mimic the old behaviour. I'm not sure it matters, having multiple `objc_bridge` attributes has never actually worked (`objc_bridge` attributes appearing earlier get "shadowed" by the most recent one), i.e. in your testcase `CFStringGetLength((__bridge CFStringRef)(NSError *)0);` has always lead to a -Wbridge-cast diagnostic.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D99661/new/

https://reviews.llvm.org/D99661

Files:
  clang/lib/Sema/SemaExprObjC.cpp
  clang/test/SemaObjCXX/bridge-cast-redecl.mm


Index: clang/test/SemaObjCXX/bridge-cast-redecl.mm
===================================================================
--- /dev/null
+++ clang/test/SemaObjCXX/bridge-cast-redecl.mm
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -std=gnu++17 -verify %s
+
+// expected-no-diagnostics
+
+typedef const struct __CFString * CFStringRef;
+
+extern "C" {
+  typedef const struct __attribute__((objc_bridge(NSString))) __CFString * CFStringRef;
+  typedef struct __attribute__((objc_bridge_mutable(NSMutableString))) __CFString * CFMutableStringRef;
+}
+
+ at interface NSString @end
+ at interface NSMutableString : NSString @end
+
+void CFStringGetLength(CFStringRef theString);
+
+int main() {
+  CFStringGetLength((__bridge CFStringRef)(NSString *)0);
+}
Index: clang/lib/Sema/SemaExprObjC.cpp
===================================================================
--- clang/lib/Sema/SemaExprObjC.cpp
+++ clang/lib/Sema/SemaExprObjC.cpp
@@ -3847,9 +3847,12 @@
   QualType QT = TDNDecl->getUnderlyingType();
   if (QT->isPointerType()) {
     QT = QT->getPointeeType();
-    if (const RecordType *RT = QT->getAs<RecordType>())
-      if (RecordDecl *RD = RT->getDecl()->getMostRecentDecl())
-        return RD->getAttr<T>();
+    if (const RecordType *RT = QT->getAs<RecordType>()) {
+      for (auto *Redecl : RT->getDecl()->getMostRecentDecl()->redecls()) {
+        if (auto *attr = Redecl->getAttr<T>())
+          return attr;
+      }
+    }
   }
   return nullptr;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D99661.334801.patch
Type: text/x-patch
Size: 1451 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210401/18fc432e/attachment.bin>


More information about the cfe-commits mailing list