]> granicus.if.org Git - clang/commitdiff
Don't crash when emitting a block under returns_nonnull.
authorJohn McCall <rjmccall@apple.com>
Thu, 10 Sep 2015 00:57:46 +0000 (00:57 +0000)
committerJohn McCall <rjmccall@apple.com>
Thu, 10 Sep 2015 00:57:46 +0000 (00:57 +0000)
rdar://22071955

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247228 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCall.cpp
test/CodeGen/sanitize-blocks.c [new file with mode: 0644]

index 344d06ba668dd3fec2df727ec7ece6bc9001c0da..2f50b85e9dba8258b1ac0d86fb620019b14ed2de 100644 (file)
@@ -2440,8 +2440,8 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
 
   llvm::Instruction *Ret;
   if (RV) {
-    if (SanOpts.has(SanitizerKind::ReturnsNonnullAttribute)) {
-      if (auto RetNNAttr = CurGD.getDecl()->getAttr<ReturnsNonNullAttr>()) {
+    if (CurCodeDecl && SanOpts.has(SanitizerKind::ReturnsNonnullAttribute)) {
+      if (auto RetNNAttr = CurCodeDecl->getAttr<ReturnsNonNullAttr>()) {
         SanitizerScope SanScope(this);
         llvm::Value *Cond = Builder.CreateICmpNE(
             RV, llvm::Constant::getNullValue(RV->getType()));
diff --git a/test/CodeGen/sanitize-blocks.c b/test/CodeGen/sanitize-blocks.c
new file mode 100644 (file)
index 0000000..103c33c
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -fsanitize-trap=returns-nonnull-attribute -fsanitize=returns-nonnull-attribute -emit-llvm %s -o - -triple x86_64-apple-darwin10 -fblocks | FileCheck %s
+
+// Awkward interactions of sanitizers with blocks.
+
+// rdar://22071955
+const char *TheString = "Hello, world!";
+const char *(^getString)(void) = ^{
+  return TheString;
+};
+
+// CHECK-LABEL: define internal i8* @getString_block_invoke
+
+// TODO: Actually support returns_nonnull on blocks.