[PATCH] D144016: [Sema] Relax a failing assertion in TransformBlockExpr
Akira Hatanaka via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 16 18:40:44 PST 2023
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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144016.498232.patch
Type: text/x-patch
Size: 2444 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230217/62a80b98/attachment.bin>
More information about the cfe-commits
mailing list