diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index 1e81ad9f2dc7a0..5b56a587fa5f76 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -127,6 +127,8 @@ class AggExprEmitter : public StmtVisitor { } 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 ef868fa85749f4..19f02c4cf41d06 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: } +}