summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2017-02-01 18:45:31 +0000
committerHans Wennborg <hans@hanshq.net>2017-02-01 18:45:31 +0000
commita6a1d3f3aa6c1d0018d84c3d6c26a552075982ab (patch)
tree79f4139a88fb1ab5a0de15c68e09ea87ed77707e
parentccd6729877c03d702cccf5f9a3c5d4c2df372ff1 (diff)
Merging r293787:
------------------------------------------------------------------------ r293787 | arphaman | 2017-02-01 09:37:28 -0800 (Wed, 01 Feb 2017) | 5 lines [CodeGen][ObjC] Avoid asserting on block pointer types in isPointerZeroInitializable rdar://30111891 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_40@293797 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CodeGenTypes.cpp2
-rw-r--r--test/CodeGenObjC/block-ptr-type-crash.m28
2 files changed, 29 insertions, 1 deletions
diff --git a/lib/CodeGen/CodeGenTypes.cpp b/lib/CodeGen/CodeGenTypes.cpp
index b95b4fff57..adb40c8c0d 100644
--- a/lib/CodeGen/CodeGenTypes.cpp
+++ b/lib/CodeGen/CodeGenTypes.cpp
@@ -737,7 +737,7 @@ CodeGenTypes::getCGRecordLayout(const RecordDecl *RD) {
}
bool CodeGenTypes::isPointerZeroInitializable(QualType T) {
- assert (T->isAnyPointerType() && "Invalid type");
+ assert((T->isAnyPointerType() || T->isBlockPointerType()) && "Invalid type");
return isZeroInitializable(T);
}
diff --git a/test/CodeGenObjC/block-ptr-type-crash.m b/test/CodeGenObjC/block-ptr-type-crash.m
new file mode 100644
index 0000000000..385d645858
--- /dev/null
+++ b/test/CodeGenObjC/block-ptr-type-crash.m
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -Wno-objc-root-class -fblocks -o /dev/null -triple x86_64-- -emit-llvm %s
+// REQUIRES: asserts
+// Verify there is no assertion.
+
+// rdar://30111891
+
+typedef unsigned long long uint64_t;
+typedef enum AnEnum : uint64_t AnEnum;
+enum AnEnum: uint64_t {
+ AnEnumA
+};
+
+typedef void (^BlockType)();
+@interface MyClass
+@end
+@implementation MyClass
+- (void)_doStuff {
+ struct {
+ int identifier;
+ AnEnum type;
+ BlockType handler;
+ } var = {
+ "hello",
+ AnEnumA,
+ ((void *)0)
+ };
+}
+@end