From c524f1a0764da0c8d1775b2860dfc33901ca9c8f Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Thu, 4 Nov 2021 09:40:22 -0400 Subject: [PATCH] No longer crash when a consteval function returns a structure Ensure that the destination slot exists in this case. This addresses PR51484. --- clang/lib/CodeGen/CGExprAgg.cpp | 2 ++ clang/test/CodeGenCXX/cxx20-consteval-crash.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index 1e81ad9..5b56a58 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -127,6 +127,8 @@ public: } void VisitConstantExpr(ConstantExpr *E) { + EnsureDest(E->getType()); + if (llvm::Value *Result = ConstantEmitter(CGF).tryEmitConstantExpr(E)) { CGF.EmitAggregateStore(Result, Dest.getAddress(), E->getType().isVolatileQualified()); diff --git a/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp b/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp index ef868fa..19f02c4 100644 --- a/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp +++ b/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp @@ -12,3 +12,15 @@ auto x2 = X(); // CHECK-NEXT: @_ZN7PR507872x2E = global i32* @_ZN7PR507872x_E, align 4 } +namespace PR51484 { +// This code would previously cause a crash. +struct X { int val; }; +consteval X g() { return {0}; } +void f() { g(); } + +// CHECK: define dso_local void @_ZN7PR514841fEv() #0 { +// CHECK: entry: +// CHECK-NOT: call i32 @_ZN7PR514841gEv() +// CHECK: ret void +// CHECK: } +} -- 2.7.4