Sema: Unnest early exit and remove an unnecessary bad cast.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 15 Feb 2013 15:17:50 +0000 (15:17 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 15 Feb 2013 15:17:50 +0000 (15:17 +0000)
cast<ObjCObjectPointerType> doesn't look through sugar, getAs does.
Fixes PR15257.

llvm-svn: 175272

clang/lib/Sema/SemaExpr.cpp
clang/test/SemaObjC/objc-literal-comparison.m

index 0ed460c..933105e 100644 (file)
@@ -6846,18 +6846,18 @@ static bool isObjCObjectLiteral(ExprResult &E) {
 }
 
 static bool hasIsEqualMethod(Sema &S, const Expr *LHS, const Expr *RHS) {
-  // Get the LHS object's interface type.
-  QualType Type = LHS->getType();
-  QualType InterfaceType;
-  if (const ObjCObjectPointerType *PTy = Type->getAs<ObjCObjectPointerType>()) {
-    InterfaceType = PTy->getPointeeType();
-    if (const ObjCObjectType *iQFaceTy =
-        InterfaceType->getAsObjCQualifiedInterfaceType())
-      InterfaceType = iQFaceTy->getBaseType();
-  } else {
-    // If this is not actually an Objective-C object, bail out.
+  const ObjCObjectPointerType *Type =
+    LHS->getType()->getAs<ObjCObjectPointerType>();
+
+  // If this is not actually an Objective-C object, bail out.
+  if (!Type)
     return false;
-  }
+
+  // Get the LHS object's interface type.
+  QualType InterfaceType = Type->getPointeeType();
+  if (const ObjCObjectType *iQFaceTy =
+      InterfaceType->getAsObjCQualifiedInterfaceType())
+    InterfaceType = iQFaceTy->getBaseType();
 
   // If the RHS isn't an Objective-C object, bail out.
   if (!RHS->getType()->isObjCObjectPointerType())
@@ -6876,8 +6876,7 @@ static bool hasIsEqualMethod(Sema &S, const Expr *LHS, const Expr *RHS) {
                                                   /*warn=*/false);
     } else {
       // Check protocols.
-      Method = S.LookupMethodInQualifiedType(IsEqualSel,
-                                             cast<ObjCObjectPointerType>(Type),
+      Method = S.LookupMethodInQualifiedType(IsEqualSel, Type,
                                              /*instance=*/true);
     }
   }
index 0a10582..95ebfb3 100644 (file)
@@ -98,3 +98,6 @@ void testNilComparison() {
   RETURN_IF_NIL(@(1+1));
 }
 
+void PR15257(Class c) {
+  return c == @""; // expected-warning{{direct comparison of a string literal has undefined behavior}}
+}