diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/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()) - if (RecordDecl *RD = RT->getDecl()->getMostRecentDecl()) - return RD->getAttr(); + if (const RecordType *RT = QT->getAs()) { + for (auto *Redecl : RT->getDecl()->getMostRecentDecl()->redecls()) { + if (auto *attr = Redecl->getAttr()) + return attr; + } + } } return nullptr; } diff --git a/clang/test/SemaObjCXX/bridge-cast-redecl.mm b/clang/test/SemaObjCXX/bridge-cast-redecl.mm new file mode 100644 --- /dev/null +++ b/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; +} + +@interface NSString @end +@interface NSMutableString : NSString @end + +void CFStringGetLength(CFStringRef theString); + +int main() { + CFStringGetLength((__bridge CFStringRef)(NSString *)0); +}