[PATCH] D142534: [clang][codegen] Fix emission of consteval constructor of derived type
Mariya Podchishchaeva via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 8 07:31:44 PST 2023
Fznamznon updated this revision to Diff 495851.
Fznamznon added a comment.
Rebase and add a release note
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D142534/new/
https://reviews.llvm.org/D142534
Files:
clang/docs/ReleaseNotes.rst
clang/lib/CodeGen/CGExprAgg.cpp
clang/test/CodeGenCXX/cxx20-consteval-crash.cpp
Index: clang/test/CodeGenCXX/cxx20-consteval-crash.cpp
===================================================================
--- clang/test/CodeGenCXX/cxx20-consteval-crash.cpp
+++ clang/test/CodeGenCXX/cxx20-consteval-crash.cpp
@@ -92,3 +92,27 @@
}
} // namespace Issue55065
+namespace GH60166 {
+
+struct Base {
+ void* one = nullptr;
+ void* two = nullptr;
+};
+
+struct Derived : Base {
+ void* three = nullptr;
+ consteval Derived() = default;
+};
+
+void method() {
+ // CHECK: %agg.tmp.ensured = alloca %"struct.GH60166::Derived"
+ // CHECK: %0 = getelementptr inbounds { ptr, ptr, ptr }, ptr %agg.tmp.ensured, i32 0, i32 0
+ // CHECK: store ptr null, ptr %0, align 8
+ // CHECK: %1 = getelementptr inbounds { ptr, ptr, ptr }, ptr %agg.tmp.ensured, i32 0, i32 1
+ // CHECK: store ptr null, ptr %1, align 8
+ // CHECK: %2 = getelementptr inbounds { ptr, ptr, ptr }, ptr %agg.tmp.ensured, i32 0, i32 2
+ // CHECK: store ptr null, ptr %2, align 8
+ (void)Derived();
+}
+
+} // namespace GH60166
Index: clang/lib/CodeGen/CGExprAgg.cpp
===================================================================
--- clang/lib/CodeGen/CGExprAgg.cpp
+++ clang/lib/CodeGen/CGExprAgg.cpp
@@ -131,7 +131,14 @@
EnsureDest(E->getType());
if (llvm::Value *Result = ConstantEmitter(CGF).tryEmitConstantExpr(E)) {
- CGF.EmitAggregateStore(Result, Dest.getAddress(),
+ Address StoreDest = Dest.getAddress();
+ // The emitted value is guaranteed to have the same size as the
+ // destination but can have a different type. Just do a bitcast in this
+ // case to avoid incorrect GEPs.
+ if (Result->getType() != StoreDest.getType())
+ StoreDest =
+ CGF.Builder.CreateElementBitCast(StoreDest, Result->getType());
+ CGF.EmitAggregateStore(Result, StoreDest,
E->getType().isVolatileQualified());
return;
}
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -64,6 +64,9 @@
driver mode and emit an error which suggests using ``/TC`` or ``/TP``
``clang-cl`` options instead. This fixes
`Issue 59307 <https://github.com/llvm/llvm-project/issues/59307>`_.
+- Fix crash when evaluating consteval constructor of derived class whose base
+ has more than one field. This fixes
+ `Issue 60166 <https://github.com/llvm/llvm-project/issues/60166>`_.
Improvements to Clang's diagnostics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D142534.495851.patch
Type: text/x-patch
Size: 2549 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230208/9e7503b2/attachment.bin>
More information about the cfe-commits
mailing list