[clang] b48fb85 - Fix crash-on-valid with consteval temporary construction through list initialization
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 11 10:44:33 PDT 2022
Author: Aaron Ballman
Date: 2022-08-11T13:44:24-04:00
New Revision: b48fb85fe60b339b31b0381dde481b284e0fb93e
URL: https://github.com/llvm/llvm-project/commit/b48fb85fe60b339b31b0381dde481b284e0fb93e
DIFF: https://github.com/llvm/llvm-project/commit/b48fb85fe60b339b31b0381dde481b284e0fb93e.diff
LOG: Fix crash-on-valid with consteval temporary construction through list initialization
Clang currently crashes when lowering a consteval list initialization
of a temporary. This is partially working around an issue in the
template instantiation code (TreeTransform::TransformCXXTemporaryObjectExpr())
that does not yet know how to handle list initialization of temporaries
in all cases. However, it's also helping reduce fragility by ensuring
we always have a valid QualType when trying to emit a constant
expression during IR generation.
Fixes #55871
Differential Revision: https://reviews.llvm.org/D131194
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/CodeGen/CGExprConstant.cpp
clang/test/CodeGenCXX/cxx20-consteval-crash.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 5da9539b7edb6..7e895a6c8e095 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -65,7 +65,9 @@ Bug Fixes
- 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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp
index b83a874432508..f00ada98aa55b 100644
--- a/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/clang/lib/CodeGen/CGExprConstant.cpp
@@ -1395,15 +1395,12 @@ ConstantEmitter::tryEmitAbstract(const APValue &value, QualType destType) {
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);
+
+ return emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(), RetType);
}
llvm::Constant *
diff --git a/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp b/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp
index c7f03776f56db..8aa87187d6c2f 100644
--- a/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp
+++ b/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp
@@ -56,3 +56,18 @@ int foo() {
// 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
More information about the cfe-commits
mailing list