diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2014-06-11 19:10:46 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2014-06-11 19:10:46 +0000 |
commit | 9af6a78f365a74d76e4ad5b020f462f80b559cdf (patch) | |
tree | 90b3a90934369f9cdc0de8b6f263357c177a8687 | |
parent | 7b8b9ae1cb4e42324ca57b9805aea96c57cdb7b6 (diff) | |
download | bcm5719-llvm-9af6a78f365a74d76e4ad5b020f462f80b559cdf.tar.gz bcm5719-llvm-9af6a78f365a74d76e4ad5b020f462f80b559cdf.zip |
Objective-C. More tests for both bridging attributes and
a fix to make it work when CFStructs have no definition.
// rdar://17238954.
llvm-svn: 210690
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaObjC/objc-mixed-bridge-attribute.m | 33 |
2 files changed, 30 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 03482d33c31..4ef502555d6 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -3133,7 +3133,7 @@ static inline T *getObjCBridgeAttr(const TypedefType *TD) { if (QT->isPointerType()) { QT = QT->getPointeeType(); if (const RecordType *RT = QT->getAs<RecordType>()) - if (RecordDecl *RD = RT->getDecl()) + if (RecordDecl *RD = RT->getDecl()->getMostRecentDecl()) return RD->getAttr<T>(); } return nullptr; diff --git a/clang/test/SemaObjC/objc-mixed-bridge-attribute.m b/clang/test/SemaObjC/objc-mixed-bridge-attribute.m index 5fa34731967..83fb4d3cc49 100644 --- a/clang/test/SemaObjC/objc-mixed-bridge-attribute.m +++ b/clang/test/SemaObjC/objc-mixed-bridge-attribute.m @@ -15,12 +15,37 @@ typedef struct __attribute__((objc_bridge_mutable(NSMutableAttributedString))) _ struct __CFAttributedString { }; -void Test1(CFAttributedStringRef attrStr) +void Test1(CFAttributedStringRef attrStr, CFMutableAttributedStringRef mutable_attrStr) { - id x = (NSAttributedString *) attrStr; // no warning + id x = (NSAttributedString *) attrStr; + id x1 =(NSAttributedString *) mutable_attrStr; + id x2 = (NSMutableAttributedString *) attrStr; + id x3 = (NSMutableAttributedString *) mutable_attrStr; } -void Test2(NSAttributedString *attrStr) { - CFAttributedStringRef cfsr = (CFAttributedStringRef) attrStr; +void Test2(NSAttributedString *ns_attrStr, NSMutableAttributedString *ns_mutable_attr_Str) { + CFAttributedStringRef cfsr = (CFAttributedStringRef) ns_attrStr; + CFMutableAttributedStringRef cfsr1 = (CFMutableAttributedStringRef) ns_attrStr; + CFAttributedStringRef cfsr2 = (CFAttributedStringRef) ns_mutable_attr_Str; + CFMutableAttributedStringRef cfsr3 = (CFMutableAttributedStringRef) ns_mutable_attr_Str; } +// Tests with no definition declaration for struct __NDCFAttributedString. +typedef const struct __attribute__((objc_bridge(NSAttributedString))) __NDCFAttributedString *NDCFAttributedStringRef; + +typedef struct __attribute__((objc_bridge_mutable(NSMutableAttributedString))) __NDCFAttributedString *NDCFMutableAttributedStringRef; + +void Test3(NDCFAttributedStringRef attrStr, NDCFMutableAttributedStringRef mutable_attrStr) +{ + id x = (NSAttributedString *) attrStr; + id x1 =(NSAttributedString *) mutable_attrStr; + id x2 = (NSMutableAttributedString *) attrStr; + id x3 = (NSMutableAttributedString *) mutable_attrStr; +} + +void Test4(NSAttributedString *ns_attrStr, NSMutableAttributedString *ns_mutable_attr_Str) { + NDCFAttributedStringRef cfsr = (NDCFAttributedStringRef) ns_attrStr; + NDCFMutableAttributedStringRef cfsr1 = (NDCFMutableAttributedStringRef) ns_attrStr; + NDCFAttributedStringRef cfsr2 = (NDCFAttributedStringRef) ns_mutable_attr_Str; + NDCFMutableAttributedStringRef cfsr3 = (NDCFMutableAttributedStringRef) ns_mutable_attr_Str; +} |