================
@@ -348,8 +348,60 @@ class AggExprEmitter : public StmtVisitor<AggExprEmitter> {
VisitInitListExpr(e->getUpdater());
}
void VisitAbstractConditionalOperator(const AbstractConditionalOperator *e) {
- cgf.cgm.errorNYI(e->getSourceRange(),
- "AggExprEmitter: VisitAbstractConditionalOperator");
+ mlir::Location loc = cgf.getLoc(e->getSourceRange());
+
+ CIRGenFunction::OpaqueValueMapping binding(cgf, e);
+ CIRGenFunction::ConditionalEvaluation eval(cgf);
+
+ // Save whether the destination's lifetime is externally managed.
+ bool isExternallyDestructed = dest.isExternallyDestructed();
+ bool destructNonTrivialCStruct =
+ !isExternallyDestructed &&
+ e->getType().isDestructedType() == QualType::DK_nontrivial_c_struct;
+ isExternallyDestructed |= destructNonTrivialCStruct;
+
+ cgf.emitIfOnBoolExpr(
+ e->getCond(),
+ /*thenBuilder=*/
+ [&](mlir::OpBuilder &b, mlir::Location loc) {
+ eval.beginEvaluation();
+ {
+ CIRGenFunction::LexicalScope lexScope{cgf, loc,
+ b.getInsertionBlock()};
+ cgf.curLexScope->setAsTernary();
+ dest.setExternallyDestructed(isExternallyDestructed);
+ assert(!cir::MissingFeatures::incrementProfileCounter());
+ Visit(e->getTrueExpr());
+ cir::YieldOp::create(b, loc);
----------------
erichkeane wrote:
Is there a way to get here with a `throw` on either side? OR a void function
(see the other problems we had with the traditional conditional operator)?
https://github.com/llvm/llvm-project/pull/186284
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits