summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-11-16 23:22:37 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-11-16 23:22:37 +0000
commit2c312128275b46f2cd07aba787f8cddd397d610a (patch)
treeda5fc2584b7673cda3be766b5f82efcf2685eafa /clang
parent565acf92787b8bdfaeb6ecc3d0aa609551cd292b (diff)
downloadbcm5719-llvm-2c312128275b46f2cd07aba787f8cddd397d610a.tar.gz
bcm5719-llvm-2c312128275b46f2cd07aba787f8cddd397d610a.zip
ObjectiveC ARC. More validation of toll-free bridging of
CF objects with objc_bridge'ing annotaiton. // rdar://15454846 llvm-svn: 194938
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp11
-rw-r--r--clang/test/SemaObjC/objcbridge-attribute.m6
2 files changed, 14 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index ea1f2a98e3d..b59e0a62381 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/lib/Sema/SemaExprObjC.cpp
@@ -3190,7 +3190,11 @@ static bool CheckObjCBridgeNSCast(Sema &S, QualType castType, Expr *castExpr) {
S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)
<< TDNDecl->getName() << Target->getName() << CastClass->getName();
return true;
- }
+ } else {
+ S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)
+ << TDNDecl->getName() << Target->getName() << castType;
+ return true;
+ }
}
}
S.Diag(castExpr->getLocStart(), diag::err_objc_cf_bridged_not_interface)
@@ -3233,6 +3237,11 @@ static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr) {
<< ExprClass->getName() << TDNDecl->getName();
S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
return true;
+ } else {
+ S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge_to_cf)
+ << castExpr->getType() << castType;
+ S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
+ return true;
}
}
}
diff --git a/clang/test/SemaObjC/objcbridge-attribute.m b/clang/test/SemaObjC/objcbridge-attribute.m
index d961528ebde..d39861f0613 100644
--- a/clang/test/SemaObjC/objcbridge-attribute.m
+++ b/clang/test/SemaObjC/objcbridge-attribute.m
@@ -1,7 +1,7 @@
// RUN: %clang_cc1 -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s
// rdar://15454846
-typedef struct __CFErrorRef * __attribute__ ((objc_bridge(NSError))) CFErrorRef; // expected-note {{declared here}}
+typedef struct __CFErrorRef * __attribute__ ((objc_bridge(NSError))) CFErrorRef; // expected-note 2 {{declared here}}
typedef struct __CFMyColor * __attribute__((objc_bridge(12))) CFMyColorRef; // expected-error {{parameter of 'objc_bridge' attribute must be a single name of an Objective-C class}}
@@ -48,10 +48,12 @@ typedef CFErrorRef1 CFErrorRef2;
@class NSString;
-void Test2(CFErrorRef2 cf, NSError *ns, NSString *str) {
+void Test2(CFErrorRef2 cf, NSError *ns, NSString *str, Class c) {
(void)(NSString *)cf; // expected-warning {{CFErrorRef bridges to NSError, not NSString}}
(void)(NSError *)cf; // okay
(void)(MyError*)cf; // okay,
(void)(CFErrorRef)ns; // okay
(void)(CFErrorRef)str; // expected-warning {{NSString cannot bridge to CFErrorRef}}
+ (void)(Class)cf; // expected-warning {{CFErrorRef bridges to NSError, not 'Class'}}
+ (void)(CFErrorRef)c; // expected-warning {{'Class' cannot bridge to 'CFErrorRef'}}
}
OpenPOWER on IntegriCloud