r194915 - ObjetiveC ARC. Start diagnosing invalid toll free bridging.

Fariborz Jahanian fjahanian at apple.com
Fri Nov 15 17:45:25 PST 2013


Author: fjahanian
Date: Fri Nov 15 19:45:25 2013
New Revision: 194915

URL: http://llvm.org/viewvc/llvm-project?rev=194915&view=rev
Log:
ObjetiveC ARC. Start diagnosing invalid toll free bridging.
// rdar://15454846.

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticGroups.td
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaExprObjC.cpp
    cfe/trunk/test/SemaObjC/objcbridge-attribute.m

Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=194915&r1=194914&r2=194915&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Fri Nov 15 19:45:25 2013
@@ -381,6 +381,8 @@ def AutomaticReferenceCounting : DiagGro
 def ARCRepeatedUseOfWeakMaybe : DiagGroup<"arc-maybe-repeated-use-of-weak">;
 def ARCRepeatedUseOfWeak : DiagGroup<"arc-repeated-use-of-weak",
                                      [ARCRepeatedUseOfWeakMaybe]>;
+def ObjCBridge : DiagGroup<"arc-bridge-cast">;
+
 def SelectorTypeMismatch : DiagGroup<"selector-type-mismatch">;
 def Selector : DiagGroup<"selector", [SelectorTypeMismatch]>;
 def Protocol : DiagGroup<"protocol">;

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=194915&r1=194914&r2=194915&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Nov 15 19:45:25 2013
@@ -2449,6 +2449,8 @@ def err_objc_bridge_not_pointert_to_stru
   "'objc_bridge' attribute must be applied to a pointer to struct type">;
 def err_objc_bridged_not_interface : Error<
   "CF object of type %0 is bridged to '%1', which is not an Objective-C class">;
+def warn_objc_invalid_bridge : Warning<
+  "%0 bridges to %1, not %2">, InGroup<ObjCBridge>;
 
 // Function Parameter Semantic Analysis.
 def err_param_with_void_type : Error<"argument may not have 'void' type">;

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=194915&r1=194914&r2=194915&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Fri Nov 15 19:45:25 2013
@@ -3172,23 +3172,32 @@ static bool CheckObjCBridgeCast(Sema &S,
     if (TDNDecl->hasAttr<ObjCBridgeAttr>()) {
       ObjCBridgeAttr *ObjCBAttr = TDNDecl->getAttr<ObjCBridgeAttr>();
       IdentifierInfo *Parm = ObjCBAttr->getBridgedType();
+      NamedDecl *Target = 0;
       if (Parm && S.getLangOpts().ObjC1) {
         // Check for an existing type with this name.
         LookupResult R(S, DeclarationName(Parm), SourceLocation(),
                        Sema::LookupOrdinaryName);
         if (S.LookupName(R, S.TUScope)) {
-          NamedDecl *Target = R.getFoundDecl();
-          if (Target && !isa<ObjCInterfaceDecl>(Target)) {
-            S.Diag(castExpr->getLocStart(), diag::err_objc_bridged_not_interface)
-                    << castExpr->getType() << Parm->getName();
-            S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
-            S.Diag(Target->getLocStart(), diag::note_declared_at);
+          Target = R.getFoundDecl();
+          if (Target && isa<ObjCInterfaceDecl>(Target)) {
+            ObjCInterfaceDecl *ExprClass = cast<ObjCInterfaceDecl>(Target);
+            if (const ObjCObjectPointerType *InterfacePointerType =
+                  castType->getAsObjCInterfacePointerType()) {
+              ObjCInterfaceDecl *CastClass
+                = InterfacePointerType->getObjectType()->getInterface();
+              if ((CastClass == ExprClass) || (CastClass && ExprClass->isSuperClassOf(CastClass)))
+                return true;
+              S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)
+                << TDNDecl->getName() << Target->getName() << CastClass->getName();
+              return true;
+            }
           }
-        } else {
-          S.Diag(castExpr->getLocStart(), diag::err_objc_bridged_not_interface)
-                  << castExpr->getType() << Parm->getName();
-          S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
         }
+        S.Diag(castExpr->getLocStart(), diag::err_objc_bridged_not_interface)
+        << castExpr->getType() << Parm->getName();
+        S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
+        if (Target)
+          S.Diag(Target->getLocStart(), diag::note_declared_at);
       }
       return true;
     }

Modified: cfe/trunk/test/SemaObjC/objcbridge-attribute.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/objcbridge-attribute.m?rev=194915&r1=194914&r2=194915&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/objcbridge-attribute.m (original)
+++ cfe/trunk/test/SemaObjC/objcbridge-attribute.m Fri Nov 15 19:45:25 2013
@@ -48,6 +48,8 @@ typedef CFErrorRef1 CFErrorRef2;
 
 @class NSString;
 
-id Test2(CFErrorRef2 cf) {
-  return (NSString *)cf;
+void Test2(CFErrorRef2 cf) {
+  (void)(NSString *)cf; // expected-warning {{CFErrorRef bridges to NSError, not NSString}}
+  (void)(NSError *)cf; // okay
+  (void)(MyError*)cf; // okay,
 }





More information about the cfe-commits mailing list