QualType T;
if (const TypeSourceInfo *TSI = BD->getSignatureAsWritten())
T = TSI->getType();
- else
- T = getContext().getFunctionNoProtoType(getContext().VoidTy);
-
+ if (T.isNull())
+ T = getContext().VoidTy;
+ if (!T->getAs<FunctionType>())
+ T = getContext().getFunctionNoProtoType(T);
+ T = getContext().getBlockPointerType(T);
+
const BlockTextRegion *BTR =
getBlockTextRegion(BD, C.getCanonicalType(T),
STC->getAnalysisDeclContext());
}
assignData(x);
}
+
+// Blocks that called the function they were contained in that also have
+// static locals caused crashes.
+// rdar://problem/21698099
+void takeNonnullBlock(void (^)(void)) __attribute__((nonnull));
+void takeNonnullIntBlock(int (^)(void)) __attribute__((nonnull));
+
+void testCallContainingWithSignature1()
+{
+ takeNonnullBlock(^{
+ static const char str[] = "Lost connection to sharingd";
+ testCallContainingWithSignature1();
+ });
+}
+
+void testCallContainingWithSignature2()
+{
+ takeNonnullBlock(^void{
+ static const char str[] = "Lost connection to sharingd";
+ testCallContainingWithSignature2();
+ });
+}
+
+void testCallContainingWithSignature3()
+{
+ takeNonnullBlock(^void(){
+ static const char str[] = "Lost connection to sharingd";
+ testCallContainingWithSignature3();
+ });
+}
+
+void testCallContainingWithSignature4()
+{
+ takeNonnullBlock(^void(void){
+ static const char str[] = "Lost connection to sharingd";
+ testCallContainingWithSignature4();
+ });
+}
+
+void testCallContainingWithSignature5()
+{
+ takeNonnullIntBlock(^{
+ static const char str[] = "Lost connection to sharingd";
+ testCallContainingWithSignature5();
+ return 0;
+ });
+}
+