Index: clang/lib/CodeGen/CGExprAgg.cpp =================================================================== --- clang/lib/CodeGen/CGExprAgg.cpp +++ clang/lib/CodeGen/CGExprAgg.cpp @@ -127,6 +127,10 @@ } void VisitConstantExpr(ConstantExpr *E) { + // If the result is unused, no need to emit anything for it. + if (IsResultUnused) + return; + if (llvm::Value *Result = ConstantEmitter(CGF).tryEmitConstantExpr(E)) { CGF.EmitAggregateStore(Result, Dest.getAddress(), E->getType().isVolatileQualified()); Index: clang/test/CodeGenCXX/cxx20-consteval-crash.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/cxx20-consteval-crash.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 %s -emit-llvm -o - | FileCheck %s + +// Test case comes from PR51484, where this code previously caused a crash. +struct X { int val; }; +consteval X g() { return {0}; } +void f() { g(); } + +// CHECK: define dso_local void @_Z1fv() #0 { +// CHECK: entry: +// CHECK-NOT: call i32 @_Z1gv() +// CHECK: ret void +// CHECK: }