This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGcda4a0e918b5: [Sema] Relax a failing assertion in TransformBlockExpr (authored by ahatanak).
Changed prior to commit: https://reviews.llvm.org/D144016?vs=497776&id=498232#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D144016/new/ https://reviews.llvm.org/D144016 Files: clang/docs/ReleaseNotes.rst clang/lib/Sema/TreeTransform.h clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp Index: clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp =================================================================== --- clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp +++ 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 -triple x86_64-apple-darwin10 -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 <bool b> + void m() { + ^{ if constexpr(b) (void)this; else foo(); }(); + } + }; + + void test() { + S().m<false>(); + } +} + +// CHECK-LABEL: define internal void @___ZN16BlockThisCapture1S1mILb0EEEvv_block_invoke( +// CHECK: call void @_ZN16BlockThisCapture3fooEv( Index: clang/lib/Sema/TreeTransform.h =================================================================== --- clang/lib/Sema/TreeTransform.h +++ clang/lib/Sema/TreeTransform.h @@ -14598,7 +14598,12 @@ oldCapture)); assert(blockScope->CaptureMap.count(newCapture)); } - assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); + + // The this pointer may not be captured by the instantiated block, even when + // it's captured by the original block, if the expression causing the + // capture is in the discarded branch of a constexpr if statement. + assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) && + "this pointer isn't captured in the old block"); } #endif Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -141,6 +141,9 @@ driver mode and emit an error which suggests using ``/TC`` or ``/TP`` ``clang-cl`` options instead. (`#59307 <https://github.com/llvm/llvm-project/issues/59307>`_) +- Fix assert that fails when the expression causing the this pointer to be + captured by a block is part of a constexpr if statement's branch and + instantiation of the enclosing method causes the branch to be discarded. Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Index: clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp =================================================================== --- clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp +++ 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 -triple x86_64-apple-darwin10 -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 <bool b> + void m() { + ^{ if constexpr(b) (void)this; else foo(); }(); + } + }; + + void test() { + S().m<false>(); + } +} + +// CHECK-LABEL: define internal void @___ZN16BlockThisCapture1S1mILb0EEEvv_block_invoke( +// CHECK: call void @_ZN16BlockThisCapture3fooEv( Index: clang/lib/Sema/TreeTransform.h =================================================================== --- clang/lib/Sema/TreeTransform.h +++ clang/lib/Sema/TreeTransform.h @@ -14598,7 +14598,12 @@ oldCapture)); assert(blockScope->CaptureMap.count(newCapture)); } - assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); + + // The this pointer may not be captured by the instantiated block, even when + // it's captured by the original block, if the expression causing the + // capture is in the discarded branch of a constexpr if statement. + assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) && + "this pointer isn't captured in the old block"); } #endif Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -141,6 +141,9 @@ driver mode and emit an error which suggests using ``/TC`` or ``/TP`` ``clang-cl`` options instead. (`#59307 <https://github.com/llvm/llvm-project/issues/59307>`_) +- Fix assert that fails when the expression causing the this pointer to be + captured by a block is part of a constexpr if statement's branch and + instantiation of the enclosing method causes the branch to be discarded. Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits