diff --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp --- a/flang/lib/Lower/ConvertCall.cpp +++ b/flang/lib/Lower/ConvertCall.cpp @@ -216,10 +216,12 @@ auto *bldr = &converter.getFirOpBuilder(); auto stackSaveFn = fir::factory::getLlvmStackSave(builder); auto stackSaveSymbol = bldr->getSymbolRefAttr(stackSaveFn.getName()); - mlir::Value sp = bldr->create( - loc, stackSaveFn.getFunctionType().getResults(), - stackSaveSymbol, mlir::ValueRange{}) - .getResult(0); + mlir::Value sp; + fir::CallOp call = bldr->create( + loc, stackSaveFn.getFunctionType().getResults(), stackSaveSymbol, + mlir::ValueRange{}); + if (call.getNumResults() != 0) + sp = call.getResult(0); stmtCtx.attachCleanup([bldr, loc, sp]() { auto stackRestoreFn = fir::factory::getLlvmStackRestore(*bldr); auto stackRestoreSymbol = @@ -401,14 +403,16 @@ loc, funcType.getResults(), builder.getStringAttr(procName), passObject, operands, nullptr); } - callResult = dispatch.getResult(0); callNumResults = dispatch.getNumResults(); + if (callNumResults != 0) + callResult = dispatch.getResult(0); } else { // Standard procedure call with fir.call. auto call = builder.create(loc, funcType.getResults(), funcSymbolAttr, operands); - callResult = call.getResult(0); callNumResults = call.getNumResults(); + if (callNumResults != 0) + callResult = call.getResult(0); } if (caller.mustSaveResult()) { diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp --- a/flang/lib/Lower/ConvertExpr.cpp +++ b/flang/lib/Lower/ConvertExpr.cpp @@ -4276,7 +4276,9 @@ // Put the implicit loop variables in row to column order to match FIR's // Ops. (The loops were constructed from outermost column to innermost // row.) - mlir::Value outerRes = loops[0].getResult(0); + mlir::Value outerRes; + if (loops[0].getNumResults() != 0) + outerRes = loops[0].getResult(0); return {IterationSpace(innerArg, outerRes, llvm::reverse(ivars)), afterLoopNest}; }