aaron.ballman updated this revision to Diff 450271. aaron.ballman added a comment.
Improved from review feedback. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131194/new/ https://reviews.llvm.org/D131194 Files: clang/docs/ReleaseNotes.rst clang/lib/CodeGen/CGExprConstant.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 @@ -56,3 +56,18 @@ // CHECK: define{{.*}} signext i8 @_ZN10Issue545782f2IcEEcT_( // CHECK: ret i8 4 } + +namespace Issue55871 { +struct Item { + consteval Item(char c) :_char{c}{} + char _char; +}; + +int function(const Item& item1, const Item& item2) { + return 0; +} + +int foo() { + return function(Item{'a'}, Item{'a'}); +} +} // namespace Issue58871 Index: clang/lib/CodeGen/CGExprConstant.cpp =================================================================== --- clang/lib/CodeGen/CGExprConstant.cpp +++ clang/lib/CodeGen/CGExprConstant.cpp @@ -1395,15 +1395,13 @@ llvm::Constant *ConstantEmitter::tryEmitConstantExpr(const ConstantExpr *CE) { if (!CE->hasAPValueResult()) return nullptr; - const Expr *Inner = CE->getSubExpr()->IgnoreImplicit(); - QualType RetType; - if (auto *Call = dyn_cast<CallExpr>(Inner)) - RetType = Call->getCallReturnType(CGM.getContext()); - else if (auto *Ctor = dyn_cast<CXXConstructExpr>(Inner)) - RetType = Ctor->getType(); - llvm::Constant *Res = - emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(), RetType); - return Res; + + QualType RetType = CE->getType(); + if (CE->isGLValue()) + RetType = CGM.getContext().getLValueReferenceType(RetType); + assert(!RetType.isNull() && "Not certain of the constant expression's type"); + + return emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(), RetType); } llvm::Constant * Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -65,7 +65,9 @@ - Fix a crash when evaluating a multi-dimensional array's array filler expression is element-dependent. This fixes `Issue 50601 <https://github.com/llvm/llvm-project/issues/56016>`_. - +- Fixed a crash-on-valid with consteval evaluation of a list-initialized + constructor for a temporary object. This fixes + `Issue 55871 <https://github.com/llvm/llvm-project/issues/55871>`_. Improvements to Clang's diagnostics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Index: clang/test/CodeGenCXX/cxx20-consteval-crash.cpp =================================================================== --- clang/test/CodeGenCXX/cxx20-consteval-crash.cpp +++ clang/test/CodeGenCXX/cxx20-consteval-crash.cpp @@ -56,3 +56,18 @@ // CHECK: define{{.*}} signext i8 @_ZN10Issue545782f2IcEEcT_( // CHECK: ret i8 4 } + +namespace Issue55871 { +struct Item { + consteval Item(char c) :_char{c}{} + char _char; +}; + +int function(const Item& item1, const Item& item2) { + return 0; +} + +int foo() { + return function(Item{'a'}, Item{'a'}); +} +} // namespace Issue58871 Index: clang/lib/CodeGen/CGExprConstant.cpp =================================================================== --- clang/lib/CodeGen/CGExprConstant.cpp +++ clang/lib/CodeGen/CGExprConstant.cpp @@ -1395,15 +1395,13 @@ llvm::Constant *ConstantEmitter::tryEmitConstantExpr(const ConstantExpr *CE) { if (!CE->hasAPValueResult()) return nullptr; - const Expr *Inner = CE->getSubExpr()->IgnoreImplicit(); - QualType RetType; - if (auto *Call = dyn_cast<CallExpr>(Inner)) - RetType = Call->getCallReturnType(CGM.getContext()); - else if (auto *Ctor = dyn_cast<CXXConstructExpr>(Inner)) - RetType = Ctor->getType(); - llvm::Constant *Res = - emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(), RetType); - return Res; + + QualType RetType = CE->getType(); + if (CE->isGLValue()) + RetType = CGM.getContext().getLValueReferenceType(RetType); + assert(!RetType.isNull() && "Not certain of the constant expression's type"); + + return emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(), RetType); } llvm::Constant * Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -65,7 +65,9 @@ - Fix a crash when evaluating a multi-dimensional array's array filler expression is element-dependent. This fixes `Issue 50601 <https://github.com/llvm/llvm-project/issues/56016>`_. - +- Fixed a crash-on-valid with consteval evaluation of a list-initialized + constructor for a temporary object. This fixes + `Issue 55871 <https://github.com/llvm/llvm-project/issues/55871>`_. Improvements to Clang's diagnostics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits