]> granicus.if.org Git - clang/commitdiff
Extend ASTContext::getTypeInfo() and ASTContext::getObjCEncodingForType() for BlockTypes.
authorSteve Naroff <snaroff@apple.com>
Wed, 24 Sep 2008 15:05:44 +0000 (15:05 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 24 Sep 2008 15:05:44 +0000 (15:05 +0000)
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

lib/AST/ASTContext.cpp

index 4757ea98e5b13a05f100fd87d18d714106c3bd21..b0ce9eb26dad0ee68fbe6037058e133978dc0ca9 100644 (file)
@@ -308,6 +308,12 @@ ASTContext::getTypeInfo(QualType T) {
     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 @@ void ASTContext::getObjCEncodingForType(QualType T, std::string& S,
     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!");
 }