Fix block comparisons.  Radar 6732116.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68171 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index cede0e5..bdc7e44 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -2701,9 +2701,9 @@
   const FunctionType *rbase = rhs->getAsFunctionType();
   const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase);
   const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase);
-  if (lproto && rproto)
-    return !mergeTypes(lhs, rhs).isNull();
-  return false;
+  if (lproto && rproto == 0)
+    return false;
+  return !mergeTypes(lhs, rhs).isNull();
 }
 
 /// areCompatVectorTypes - Return true if the two specified vector types are 
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp
index 16e926b..c05d323 100644
--- a/lib/CodeGen/CGBlocks.cpp
+++ b/lib/CodeGen/CGBlocks.cpp
@@ -412,18 +412,19 @@
 /// function type for the block, including the first block literal argument.
 static QualType getBlockFunctionType(ASTContext &Ctx,
                                      const BlockPointerType *BPT) {
-  const FunctionProtoType *FTy = cast<FunctionProtoType>(BPT->getPointeeType());
+  const FunctionProtoType *FTy = dyn_cast<FunctionProtoType>(BPT->getPointeeType());
+  const clang::QualType ResType = BPT->getPointeeType()->getAsFunctionType()->getResultType();
 
   llvm::SmallVector<QualType, 8> Types;
   Types.push_back(Ctx.getPointerType(Ctx.VoidTy));
 
-  for (FunctionProtoType::arg_type_iterator i = FTy->arg_type_begin(),
-       e = FTy->arg_type_end(); i != e; ++i)
-    Types.push_back(*i);
+  if (FTy)
+    for (FunctionProtoType::arg_type_iterator i = FTy->arg_type_begin(),
+           e = FTy->arg_type_end(); i != e; ++i)
+      Types.push_back(*i);
 
-  return Ctx.getFunctionType(FTy->getResultType(),
-                             &Types[0], Types.size(),
-                             FTy->isVariadic(), 0);
+  return Ctx.getFunctionType(ResType, &Types[0], Types.size(),
+                             FTy && FTy->isVariadic(), 0);
 }
 
 RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr* E) {