@@ -263,12 +263,52 @@ void Fortran::lower::genSyncTeamStatement(
263263
264264void Fortran::lower::genPauseStatement (
265265 Fortran::lower::AbstractConverter &converter,
266- const Fortran::parser::PauseStmt &) {
266+ const Fortran::parser::PauseStmt &stmt ) {
267267 fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
268268 mlir::Location loc = converter.getCurrentLocation ();
269- mlir::func::FuncOp callee =
270- fir::runtime::getRuntimeFunc<mkRTKey (PauseStatement)>(loc, builder);
271- fir::CallOp::create (builder, loc, callee, mlir::ValueRange{});
269+ Fortran::lower::StatementContext stmtCtx;
270+ llvm::SmallVector<mlir::Value> operands;
271+ mlir::func::FuncOp callee;
272+ mlir::FunctionType calleeType;
273+
274+ if (stmt.v .has_value ()) {
275+ const Fortran::parser::StopCode &code = stmt.v .value ();
276+ auto expr = converter.genExprValue (*Fortran::semantics::GetExpr (code), stmtCtx);
277+ LLVM_DEBUG (llvm::dbgs () << " pause expression: " ; expr.dump (); llvm::dbgs () << ' \n ' );
278+ expr.match (
279+ [&](const fir::CharBoxValue &x) {
280+ callee = fir::runtime::getRuntimeFunc<mkRTKey (PauseStatementText)>(loc, builder);
281+ calleeType = callee.getFunctionType ();
282+ operands.push_back (
283+ builder.createConvert (loc, calleeType.getInput (0 ), x.getAddr ()));
284+ operands.push_back (
285+ builder.createConvert (loc, calleeType.getInput (1 ), x.getLen ()));
286+ },
287+ [&](fir::UnboxedValue x) {
288+ callee = fir::runtime::getRuntimeFunc<mkRTKey (PauseStatement)>(loc, builder);
289+ calleeType = callee.getFunctionType ();
290+ mlir::Value cast =
291+ builder.createConvert (loc, calleeType.getInput (0 ), x);
292+ operands.push_back (cast);
293+ },
294+ [&](auto ) {
295+ mlir::emitError (loc, " unhandled expression in PAUSE" );
296+ std::exit (1 );
297+ });
298+ } else {
299+ callee = fir::runtime::getRuntimeFunc<mkRTKey (PauseStatement)>(loc, builder);
300+ calleeType = callee.getFunctionType ();
301+ }
302+
303+ fir::CallOp::create (builder, loc, callee, operands);
304+
305+ auto blockIsUnterminated = [&builder]() {
306+ mlir::Block *currentBlock = builder.getBlock ();
307+ return currentBlock->empty () ||
308+ !currentBlock->back ().hasTrait <mlir::OpTrait::IsTerminator>();
309+ };
310+ if (blockIsUnterminated ())
311+ genUnreachable (builder, loc);
272312}
273313
274314void Fortran::lower::genPointerAssociate (fir::FirOpBuilder &builder,
0 commit comments