diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -14598,7 +14598,8 @@ oldCapture)); assert(blockScope->CaptureMap.count(newCapture)); } - assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); + assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) && + "this pointer isn't captured in the old block"); } #endif diff --git a/clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp b/clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp --- a/clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp +++ b/clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++1z %s -emit-llvm -o - | FileCheck %s --implicit-check-not=should_not_be_used +// RUN: %clang_cc1 -std=c++1z %s -emit-llvm -fblocks -o - | FileCheck %s --implicit-check-not=should_not_be_used void should_be_used_1(); void should_be_used_2(); @@ -32,3 +32,20 @@ // CHECK: should_be_used_1 // CHECK: should_be_used_2 // CHECK: should_be_used_3 + +namespace BlockThisCapture { + void foo(); + struct S { + template + void m() { + ^{ if constexpr(b) (void)this; else foo(); }(); + } + }; + + void test() { + S().m(); + } +} + +// CHECK-LABEL: define internal void @___ZN16BlockThisCapture1S1mILb0EEEvv_block_invoke( +// CHECK: call void @_ZN16BlockThisCapture3fooEv(