Author: Aaron Ballman Date: 2021-11-04T09:41:10-04:00 New Revision: c524f1a0764da0c8d1775b2860dfc33901ca9c8f
URL: https://github.com/llvm/llvm-project/commit/c524f1a0764da0c8d1775b2860dfc33901ca9c8f DIFF: https://github.com/llvm/llvm-project/commit/c524f1a0764da0c8d1775b2860dfc33901ca9c8f.diff LOG: No longer crash when a consteval function returns a structure Ensure that the destination slot exists in this case. This addresses PR51484. Added: Modified: clang/lib/CodeGen/CGExprAgg.cpp clang/test/CodeGenCXX/cxx20-consteval-crash.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index 1e81ad9f2dc7a..5b56a587fa5f7 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -127,6 +127,8 @@ class AggExprEmitter : public StmtVisitor<AggExprEmitter> { } 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 ef868fa85749f..19f02c4cf41d0 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: } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits