forked from OSchip/llvm-project
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
This commit is contained in:
parent
57f334d817
commit
b48fb85fe6
|
@ -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
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue