]> granicus.if.org Git - clang/commitdiff
Only accept __bridge_retain in system headers, as Doug suggested.
authorJohn McCall <rjmccall@apple.com>
Fri, 17 Jun 2011 21:56:12 +0000 (21:56 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 17 Jun 2011 21:56:12 +0000 (21:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133300 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseExpr.cpp
test/SemaObjC/Inputs/arc-system-header.h
test/SemaObjC/arc-bridged-cast.m
test/SemaObjC/arc-system-header.m

index fb1c90950822ea0eff0c9806b5246a530ac01c5a..3764a4091546be3315680a597b6ba312b00f6fb1 100644 (file)
@@ -263,6 +263,11 @@ def warn_objc_protocol_qualifier_missing_id : Warning<
 def err_objc_unknown_at : Error<"expected an Objective-C directive after '@'">;
 def err_illegal_super_cast : Error<
   "cannot cast 'super' (it isn't an expression)">;
+
+let CategoryName = "Automatic Reference Counting Issue" in {
+def err_arc_bridge_retain : Error<
+  "unknown cast annotation __bridge_retain; did you mean __bridge_retained?">;
+}
   
 def err_objc_illegal_visibility_spec : Error<
   "illegal visibility specification">;
index 14f3805cd9712ca03a9ec53916de9b9b5ec0210c..39db0e90450d4f3370a3cfc822e5f873f0394949 100644 (file)
@@ -1781,17 +1781,29 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
              (Tok.is(tok::kw___bridge) || 
               Tok.is(tok::kw___bridge_transfer) ||
               Tok.is(tok::kw___bridge_retained) ||
-              Tok.is(tok::kw___bridge_retain))) { // FIXME: temporary workaround
+              Tok.is(tok::kw___bridge_retain))) {
+    tok::TokenKind tokenKind = Tok.getKind();
+    SourceLocation BridgeKeywordLoc = ConsumeToken();
+
     // Parse an Objective-C ARC ownership cast expression.
     ObjCBridgeCastKind Kind;
-    if (Tok.is(tok::kw___bridge))
+    if (tokenKind == tok::kw___bridge)
       Kind = OBC_Bridge;
-    else if (Tok.is(tok::kw___bridge_transfer))
+    else if (tokenKind == tok::kw___bridge_transfer)
       Kind = OBC_BridgeTransfer;
-    else 
+    else if (tokenKind == tok::kw___bridge_retained)
+      Kind = OBC_BridgeRetained;
+    else {
+      // As a hopefully temporary workaround, allow __bridge_retain as
+      // a synonym for __bridge_retained, but only in system headers.
+      assert(tokenKind == tok::kw___bridge_retain);
       Kind = OBC_BridgeRetained;
+      if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
+        Diag(BridgeKeywordLoc, diag::err_arc_bridge_retain)
+          << FixItHint::CreateReplacement(BridgeKeywordLoc,
+                                          "__bridge_retained");
+    }
              
-    SourceLocation BridgeKeywordLoc = ConsumeToken();
     TypeResult Ty = ParseTypeName();
     SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, OpenLoc);
     ExprResult SubExpr = ParseCastExpression(false, false, ParsedType());
index 9e76cd84ab7d1179710926d9345de1ad5e79e6dd..5012a2a37837479e65d798f2d65ee3aadbe9565b 100644 (file)
@@ -40,3 +40,13 @@ extern struct Test6 *const kMagicConstant;
 @interface Test7
 @property id *prop;
 @end
+
+
+
+
+
+
+
+static inline void *test8(id ptr) {
+  return (__bridge_retain void*) ptr;
+}
index d302182476d02ad540a24ffb97c34d14f1038148..e883406db908864c19feaf537409958656fab87f 100644 (file)
@@ -30,7 +30,7 @@ void to_cf(id obj) {
   CFStringRef cf4 = (__bridge CFStringRef)CreateNSString();
 
   // rdar://problem/9629566 - temporary workaround
-  CFTypeRef cf5 = (__bridge_retain CFTypeRef)CreateSomething();
+  CFTypeRef cf5 = (__bridge_retain CFTypeRef)CreateSomething(); // expected-error {{unknown cast annotation __bridge_retain; did you mean __bridge_retained?}}
 }
 
 void fixits() {
index e635dc0a80bce1214bb8ad44a1beeb287416610c..9d8aaf43d29e06616d8ecf6b56fc9e0870deb2c0 100644 (file)
@@ -46,3 +46,5 @@ void test7(Test7 *p) {
   [p setProp: 0]; // expected-error {{'setProp:' is unavailable: this system declaration uses an unsupported type}}
 }
 #endif
+
+// test8 in header