Extend ASTContext::getTypeInfo() and ASTContext::getObjCEncodingForType() for BlockTypes.

This fixes <rdar://problem/6240616> clang: Assertion failed when using typedef and Blocks.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56554 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 4757ea9..b0ce9eb 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -308,6 +308,12 @@
     Width = Target.getPointerWidth(0);
     Align = Target.getPointerAlign(0);
     break;
+  case Type::BlockPointer: {
+    unsigned AS = cast<BlockPointerType>(T)->getPointeeType().getAddressSpace();
+    Width = Target.getPointerWidth(AS);
+    Align = Target.getPointerAlign(AS);
+    break;
+  }
   case Type::Pointer: {
     unsigned AS = cast<PointerType>(T)->getPointeeType().getAddressSpace();
     Width = Target.getPointerWidth(AS);
@@ -1668,6 +1674,8 @@
     S += '}';
   } else if (T->isEnumeralType()) {
     S += 'i';
+  } else if (T->isBlockPointerType()) {
+    S += '^'; // This type string is the same as general pointers.
   } else
     assert(0 && "@encode for type not implemented!");
 }